typedreammoon/dreamfx/dream-fx-create

Claude Code and agent skill by typedreammoon/dreamfx

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Write a new DreamFXLang Niagara effect from a plain-language description, then build it headlessly to prove it compiles. Use when asked to create, author, add, or write a .dfs / .dfe / .dfm, a DreamFX effect, or a text-authored Niagara system for an Unreal project.

Install

npx vskill@latest install typedreammoon/dreamfx/dream-fx-create

SKILL.md

dream-fx-create <description>

Writes a .dfs and proves it builds. The proving is not optional — module input names are read off real assets, and nobody, including you, can guess them reliably.

Paths below are relative to the plugin root, Plugins/DreamFX/.

The loop

  1. Find the modules. dfx.ps1 list prints every module the search paths expose.
  2. Read their real signatures. dfx.ps1 schema <Module> — once per module you intend to call.

This is the step people skip and then spend twenty minutes on.

  1. Write the file under a DFX/ root.
  2. Build it. dfx.ps1 build <file> -Force.
  3. Fix and repeat. Diagnostics carry line and column; see

`dream-fx-diagnose` for what each code means.

bash
pwsh -File Plugins/DreamFX/.skill/dfx.ps1 schema AddVelocityInCone
bash
pwsh -File Plugins/DreamFX/.skill/dfx.ps1 build DFX/Samples/NS_MyEffect.dfs -Force

Skeleton

cpp
System(Name="Samples/NS_MyEffect", Root="Plugin.DreamFX")
{
Settings = { WarmupTime = 0.0; }
Properties = { int Count = 24 [ Group="Burst" ]; }
Emitter Sparks
{
Settings = { SimTarget = CPU; Determinism = true; RandomSeed = 1337; }
EmitterUpdate = {
EmitterState(LifeCycleMode = Self, LoopBehavior = Once, LoopDuration = 0.15);
SpawnBurst_Instantaneous(SpawnCount = User.Count);
}
ParticleSpawn = {
Spawn/Initialization/InitializeParticle(WriteLifetime = true, Lifetime = 0.4);
SystemLocation();
}
ParticleUpdate = {
GravityForce(Gravity = (0, 0, -980));
SolveForcesAndVelocity();
}
SpriteRenderer Core { Alignment = Unaligned; }
}
}

The five things that trip people up

  1. Write the static switch before the input it gates. Source order is write order. LifeCycleMode

gates LoopBehavior, which gates LoopDuration. WriteSpriteSize = true gates SpriteSize. Out of order you get DFX5021, saying the input is hidden or its EditCondition is false.

  1. Input names have spaces in Niagara and none in DreamFX. Loop Duration is written

LoopDuration. Checkbox inputs live in the Module. namespace and the prefix is dropped: Module.WriteLifetime is written WriteLifetime.

  1. Linked parameters do not convert. User.Count on an int input must itself be int. A float

there is DFX4027, and it is a real bug, not a pedantic one.

  1. `hlsl { }` must be a single expression. No statements, no locals, no return. The node it

lowers to has one output pin and no body to put them in. Multi-statement logic goes in a .dfm `Module`, whose body is emitted verbatim — not a DynamicInput, whose body the translator wraps as Output = (Type)( ... ); and which is therefore under the same one-expression limit. See `Docs/language/dfm.md`.

  1. A short module name that matches twice is refused, not guessed. Disambiguate with a partial

path: Spawn/Initialization/InitializeParticle selects that asset and not its V2/ sibling.

  1. Generating a `.dfm` needs MoonEngine. Writing HLSL onto a Niagara custom node uses export

macros a stock engine does not have, so .dfm generation is probe-gated at build time. The product is unrestricted: generate the module on MoonEngine, commit the asset, and any engine references and cooks it. Elsewhere the build reports DFX5100 (no asset) or DFX5107 (asset out of date).

Value forms

WrittenBecomes
450.0, 24, true, (1, 0, 0, 1)a literal
Once, Complete, Uniforman enum entry — the label, not the internal name
User.Speed, Particles.Velocity, Engine.Timea linked parameter
RandomRangeFloat(Minimum = 1.0, Maximum = 2.0)a dynamic input; nests to any depth
User.Speed * 0.6, normalize(Particles.Velocity)one HLSL expression (L6 whitelist)
hlsl { saturate(1.0 - Particles.NormalizedAge) }a raw HLSL expression
curve { 0.0 -> 1.0; 1.0 -> 0.0 [ Interp=Linear ]; }a curve data interface

Inline arithmetic is limited to + - * / %, unary minus, and normalize saturate clamp lerp frac min max abs floor ceil pow sqrt dot cross length. Anything else is DFX4031 — that boundary is deliberate and widening it is a design decision, not a fix.

Assignments

cpp
Particles.Moon.SparkSeed = 0.5; // type inferred from the literal
Color Particles.Color = hlsl { ... }; // type written out: an expression carries none

Consecutive assignments fold into one Set Parameters module. A module call between them starts a new group. A first assignment declares the attribute; write the type explicitly whenever the value is an expression, an hlsl block or a dynamic input, because inference only works on literals.

Where the file goes

Name= is a package path relative to the root named by Root=:

Root=Resolves to
omitted, or "Game"/Game
"Plugin.MoonToon"/MoonToon

Source lives under a DFX/ directory — the project's, or a plugin's. -All finds every one.

See also

the value modes and the L* rules

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/typedreammoon/dreamfx/dream-fx-create/badge)](https://verified-skill.com/skills/typedreammoon/dreamfx/dream-fx-create)

Something wrong with this skill or its page? Tell us.