Tools:
- WitchyBND (version at time of writing is 2.4.0.1)
- Notepad++
General
SFX are the special visual effects that use models and textures to "simulate" glowing, fire, flames, and magic. They are located in the "sfx" folder of the game:
1. Common Effects: SFX can appear everywhere, such as magic.
For ER and AC6, there is the "sfxbnd_commoneffects.ffxbnd.dcx" that contains SFX that can appear
everywhere, such as magic.
For DS3, there is a separate "frpg_sfxbnd_commoneffects_effect.ffxbnd.dcx" and
"frpg_sfxbnd_commoneffects_resource.ffxbnd.dcx" file and additional ones for the DLCs.
2. Map SFX: Some SFX are exclusive to particular regions, e.g. "sfxbnd_m11.ffxbnd.dcx" for map 11.
3. Character SFX: Some SFX are exclusive to special enemies, e.g. "sfxbnd_c3750.ffxbnd.dcx" for c3750.
After you unpack a .ffxbnd for ER/AC6 there will be some folders inside:
- "texture" which holds the textures as .tpf files, can be (un)packed
- "model" which holds the models as .flver files, can only be converted/exported/imported
- "effect" which holds the .fxr files
- "animation" which holds the animation files (.hkx)
- "resource" which holds the resource lists (.ffxlist) files for FXR with the same ID. They need to include the .tif and .sib file names (actually refers to .tpf and .flver files) that the .fxr file uses or they aren't loaded when the SFX is called.
For DS3, files are separated into 2 bnds:
- _effect.ffxbnd.dcx, which holds the fxr files
- _resource.ffxbnd.dcx, which holds the hkx (animation), model, and tex (texture) files. Also, there are no resource lists.
The .fxr files determine what the SFX looks like. To edit them, you need to convert them into .xml files with WitchyBND. When you are done with your edits, you need to convert the .xml back to .fxr with WitchyBND. You will then need to add any new .fxr files (and any new resources in ER/AC6) as entries in the _witchy-bnd4.xml (found in the effect folder) using Notepad++. Finally, repack the .ffxbnd with WitchyBND.
This tutorial will mention everything that is special for DS3 or ER/AC6 when editing. The SFX system has been slightly reworked and some fields or properties have changed.
References
These sheets contain all the calls of the FXR file which are explained in the example further down.
At the present time, please use the Elden Ring FXR notes for AC6 edits and make note of any irregularities.
Spell SFX example
To give an overview, you can convert a spell .fxr file (e.g. Lightning Spear: f000525500.ffx -> f000525500.fxr.xml) and then open it with Notepad++. In Notepad++, collapse all sections (in view tab) so it looks like this:
Overview
This is an overview with all actions, effects, and containers collapsed:
<RootContainer Id="2000"> <Actions> <Action Id="700" tag="mandatory action in ER, currently unknown"> <Action Id="10100" tag="mandatory action, currently unknown"> <Action Id="10400" tag="mandatory action, currently unknown"> <Action Id="10500" tag="mandatory action, fields are unknown, property (only in ER) controls rate of time"> </Actions> <Effects /> <Containers> <Container Id="2200" tag="main effect with child containers"> <Actions> <Action Id="199"> </Actions> <Effects> <Effect Id="1004" tag="parent effect that holds the main and secondary actions"> </Effects> <Containers> <Container Id="2200" tag="2200 environment lighting"> <Container Id="2200" tag="2200 light stuff"> <Container Id="2200" tag="2200 lightning spear model"> <Container Id="2200" tag="2200 lightning sparks around the spear first middle then extending once"> <Container Id="2200" tag="2200 short lightning lines emitting from the hand in every direction"> </Containers> </Container> </Containers> </Container>
The first Container is the "RootContainer" and always has the Id "2000" and holds every effect.
The "tag" value was added to everything to track what every effect is doing.
Note that you can change the Id of any container to "0", which disables it. Just make sure you remember or notate what it was originally! You can make in-file notes after the ">" of each line or write a tag as shown above.
Let's take a look at the "lightning spear model" Container:
<Container Id="0" tag="2200 lightning spear model"> <Actions> <Action Id="199" tag="mandatory action, currently unknown"> </Actions> <Effects> <Effect Id="1004" tag="1004 first lightning spear"> </Effects> <Containers> <Container Id="2200" tag="2200 second lightning spear"> </Containers> </Container>
As you can see, there are actually 2 lightning spear models: one getting spawned from the Container, and one child Container which is almost the same. The difference is their lifetime and scaling. One changes scaling over time and disappears, while the other doesn't and stays longer. This is often done for SFX which have an expanding model.
Here is a look at the "Effect" 1004 of the first one:
<Effect Id="1004" tag="1004 first lightning spear"> <Actions> <Action Id="128" tag="emitter values"> <Action Id="35" tag="rotation and translation values"> <Action Id="1" tag="emitter values"> <Action Id="0" tag="empty but can be sound action 75"> <Action Id="300" tag="instance spawn amount"> <Action Id="400" tag="spawn shape of the emitter"> <Action Id="500" tag="?"> <Action Id="131" tag="multipliers"> <Action Id="129" tag="instance lifetime"> <Action Id="605" tag="main action, 605 uses a model"> <Action Id="55" tag="cluster movement"> <Action Id="0"> <Action Id="130" tag="?"> <Action Id="0"> <Action Id="0">
Only ER has the last 2 additional actions. Both effect 1004 and 1005 have a set number of slots and only specific actions can fill them or replace an action. 0 means there is not action set.
This could even be true for main actions which hold the texture, model or geometry. This occures if there is a parent effect node with only rotation or movement actions and several child effects which then are all affected by those actions.
Here is the expanded view of the action 128:
<Action Id="128" tag="emitter values"> <Unk02>false</Unk02> <Unk03>true</Unk03> <Unk04>0</Unk04> <Section10s /> <Fields1> <Int Value="0" /> <Int Value="1" /> <Int Value="1" /> <Int Value="0" /> </Fields1> <Fields2 /> <Properties1> <Property PropertyType="Scalar" InterpolationType="StaticValue" IsLoop="false"> <Fields> <Float Value="-0.033333335" /> </Fields> <Modifiers /> </Property> </Properties1> <Properties2 /> </Action>
You can look up the actions and their fields & properties in the FXR notes. Ignore the "Unk" (unknown) tags at the top. Some actions don't have values for "Fields2", so they only have the closing tags like "<Fields2 />" as seen in this example.
Important to note is that fields can only be set and will remain at the same value, while properties can be changed to different property and interpolation types to change over time.
Here is an example of a static value:
<Property PropertyType="Scalar" InterpolationType="StaticValue" IsLoop="false"> <Fields> <Float Value="5" /> </Fields> <Modifiers /> </Property>
Here is an example of a value that changes linear over time:
<Property PropertyType="Scalar" InterpolationType="Linear" IsLoop="false"> <Fields> <Int Value="2" /> <Float Value="0" /> <Float Value="2.5" /> <Float Value="0" /> <Float Value="1" /> <Float Value="2.5" /> <Float Value="0" /> </Fields> </Property>
To learn more about it, it is best to start out by dissecting a spell to analyze different parts of an sfx. This can be done by setting all effects to "0" except one, check what is left in-game and then give it a description.
Then compare the effect and the actions with the resource sheets.
This is essential to grasp the concept of visual effects if you have never worked with them.
Example:
Main actions for flames will have textures with slices on them and they will cycle through each of those at a certain speed which is all set with fields.
Small particles that are hovering in the air in a map area are not simply spawned everywhere but are spawned in a range and form around the player. Those ranges are the emitter form which can be e.g. a sphere or a box.
Drops, fog gates, bonfire reset screen, movement in the environment causing e.g. sand to whirl or water to splash is all sfx.