FXR typed actions
An FXR effect file is a tree of nodes whose configs hold actions. An action’s type says what it is for (emit particles on a schedule, give them a shape and a direction, move them, draw them as one of a dozen forms, light the scene, play a sound, spawn another effect), and its parameters are the values in its lists. This page records the types the installs use, where their parameters sit, which values they take and how nodes, configs and slots are arranged. The 64-byte action record and the file layout are on the FXR page. The names of the types and parameters, their kinds and defaults, and what the values mean are the fxr project’s. Sourced · fxr
The types in the installs
Section titled “The types in the installs”The 2,913 Sekiro files and 12,155 Elden Ring files (copies of one effect in several binders included) hold 354,778 and
1,463,977 actions of 63 and 70 types besides type 0, the empty slot: 72 types in all, 61 of them in both games.
Proven · every action of every file of both installs; two independent readers count the same actions of every type
Type 0 is 111,431 and 480,016 of those actions and holds no list at all. Proven
Nine types occur only in Elden Ring (11, 123, 700, 701, 702, 731, 10001, 10014 and 10015) and two only in Sekiro (733 and
10301). Proven
The project names 67 of the 72; it leaves 11, 130, 10100, 10400 and 10500 as Unk types. Sourced · fxr
Files is the number of files holding at least one action of the type; actions are counted over all files. The slot is the project’s grouping of the types by the job they do; a config holds at most one action of a slot (see nodes, configs and slots). Sourced · fxr
| Type | Name | Slot | Files (Sekiro / Elden Ring) | Actions (Sekiro / Elden Ring) |
|---|---|---|---|---|
| 1 | NodeAcceleration | NodeMovement | 2,457 / 8,943 | 10,794 / 35,506 |
| 11 | Unk11 | NodeMovement | - / 26 | - / 33 |
| 15 | NodeTranslation | NodeMovement | 139 / 508 | 295 / 869 |
| 34 | NodeSpin | NodeMovement | 346 / 817 | 582 / 1,481 |
| 35 | StaticNodeTransform | NodeTransform | 2,645 / 10,685 | 20,878 / 81,215 |
| 36 | RandomNodeTransform | NodeTransform | 123 / 739 | 248 / 1,104 |
| 46 | NodeAttachToCamera | NodeMovement | 62 / 110 | 136 / 124 |
| 55 | ParticleAcceleration | ParticleMovement | 1,449 / 5,216 | 4,196 / 17,436 |
| 60 | ParticleSpeed | ParticleMovement | 445 / 1,775 | 1,014 / 4,336 |
| 64 | ParticleSpeedRandomTurns | ParticleMovement | 189 / 902 | 430 / 1,431 |
| 65 | ParticleSpeedPartialFollow | ParticleMovement | 151 / 942 | 431 / 2,498 |
| 75 | NodeSound | NodeAudio | 882 / 3,443 | 947 / 3,519 |
| 83 | NodeAccelerationRandomTurns | NodeMovement | 20 / 91 | 28 / 141 |
| 84 | ParticleAccelerationRandomTurns | ParticleMovement | 515 / 2,096 | 988 / 3,254 |
| 105 | ParticleAccelerationPartialFollow | ParticleMovement | 791 / 3,615 | 2,616 / 10,364 |
| 106 | NodeAccelerationPartialFollow | NodeMovement | 277 / 831 | 1,993 / 2,438 |
| 113 | NodeAccelerationSpin | NodeMovement | 23 / 105 | 26 / 117 |
| 120 | NodeSpeed | NodeMovement | 18 / 49 | 39 / 84 |
| 121 | NodeSpeedRandomTurns | NodeMovement | 10 / 121 | 41 / 185 |
| 122 | NodeSpeedPartialFollow | NodeMovement | 26 / 38 | 72 / 53 |
| 123 | NodeSpeedSpin | NodeMovement | - / 14 | - / 24 |
| 128 | NodeAttributes | NodeAttributes | 2,671 / 10,818 | 21,825 / 88,805 |
| 129 | ParticleAttributes | ParticleAttributes | 2,669 / 10,818 | 21,248 / 86,669 |
| 130 | Unk130 | Unknown130 | 2,669 / 10,818 | 21,248 / 86,669 |
| 131 | ParticleModifier | ParticleModifier | 2,669 / 10,818 | 21,248 / 86,669 |
| 132 | SFXReference | SFXReference | 460 / 3,489 | 543 / 5,228 |
| 133 | LevelsOfDetailThresholds | LevelsOfDetailThresholds | 125 / 918 | 125 / 920 |
| 199 | StateConfigMap | StateConfigMap | 2,671 / 10,818 | 20,916 / 88,403 |
| 200 | SelectAllNodes | NodeSelector | 372 / 1,418 | 523 / 2,042 |
| 201 | SelectRandomNode | NodeSelector | 43 / 71 | 54 / 94 |
| 300 | PeriodicEmitter | Emitter | 1,976 / 7,918 | 8,740 / 38,788 |
| 301 | EqualDistanceEmitter | Emitter | 494 / 1,057 | 1,512 / 2,667 |
| 399 | OneTimeEmitter | Emitter | 2,634 / 10,622 | 11,573 / 47,350 |
| 400 | PointEmitterShape | EmitterShape | 2,653 / 10,757 | 17,690 / 70,747 |
| 401 | DiskEmitterShape | EmitterShape | 208 / 826 | 554 / 2,363 |
| 402 | RectangleEmitterShape | EmitterShape | 33 / 44 | 65 / 84 |
| 403 | SphereEmitterShape | EmitterShape | 205 / 1,140 | 451 / 2,202 |
| 404 | BoxEmitterShape | EmitterShape | 886 / 3,540 | 2,640 / 11,682 |
| 405 | CylinderEmitterShape | EmitterShape | 204 / 749 | 425 / 1,727 |
| 500 | NoSpread | DirectionSpread | 2,635 / 10,627 | 11,905 / 48,404 |
| 501 | CircularSpread | DirectionSpread | 2,085 / 7,789 | 9,549 / 38,617 |
| 502 | EllipticalSpread | DirectionSpread | 10 / 115 | 23 / 300 |
| 503 | RectangularSpread | DirectionSpread | 145 / 528 | 348 / 1,484 |
| 600 | PointSprite | Appearance | 342 / 2,179 | 587 / 3,375 |
| 601 | Line | Appearance | 28 / 6 | 29 / 6 |
| 602 | QuadLine | Appearance | 59 / 1,969 | 103 / 2,424 |
| 603 | BillboardEx | Appearance | 1,945 / 5,709 | 7,638 / 17,392 |
| 604 | MultiTextureBillboardEx | Appearance | 716 / 5,485 | 1,600 / 13,852 |
| 605 | Model | Appearance | 511 / 729 | 1,010 / 1,493 |
| 606 | LegacyTracer | Appearance | 157 / 93 | 282 / 122 |
| 607 | Distortion | Appearance | 119 / 1,148 | 167 / 1,359 |
| 608 | RadialBlur | Appearance | 453 / 1,266 | 485 / 1,338 |
| 609 | PointLight | Appearance | 714 / 4,369 | 834 / 4,999 |
| 700 | SimulateTermination | Termination | - / 10,872 | - / 10,884 |
| 701 | FadeTermination | Termination | - / 288 | - / 288 |
| 702 | InstantTermination | Termination | - / 844 | - / 844 |
| 731 | NodeForceSpeed | NodeForceMovement | - / 9 | - / 14 |
| 732 | ParticleForceSpeed | ParticleForceMovement | 173 / 356 | 520 / 923 |
| 733 | NodeForceAcceleration | NodeForceMovement | 1 / - | 1 / - |
| 734 | ParticleForceAcceleration | ParticleForceMovement | 25 / 180 | 91 / 535 |
| 10000 | GPUStandardParticle | Appearance | 31 / 76 | 47 / 99 |
| 10001 | GPUStandardCorrectParticle | Appearance | - / 5 | - / 5 |
| 10012 | Tracer | Appearance | 475 / 2,046 | 2,123 / 6,410 |
| 10013 | WaterInteraction | Appearance | 51 / 172 | 51 / 186 |
| 10014 | LensFlare | Appearance | - / 69 | - / 97 |
| 10015 | RichModel | Appearance | - / 1,766 | - / 3,052 |
| 10100 | Unk10100 | Unknown10100 | 2,910 / 12,005 | 2,910 / 12,005 |
| 10300 | WindForce | Appearance | 72 / 102 | 76 / 106 |
| 10301 | GravityForce | Appearance | 1 / - | 1 / - |
| 10400 | Unk10400 | Unknown10400 | 2,910 / 12,005 | 2,910 / 12,005 |
| 10500 | Unk10500 | Unknown10500 | 2,910 / 12,005 | 2,910 / 12,005 |
| 11000 | SpotLight | Appearance | 11 / 15 | 13 / 17 |
Proven
Where a parameter is
Section titled “Where a parameter is”An action stores up to four lists, all named by its record: the first and second property lists (40-byte records, each a constant or a function of time, see properties) and the first and second field lists (32-bit words). A parameter is the entry at an index of one list. A vector parameter of a field list spans two to four consecutive words. Sourced · fxr Two types keep their data in a third kind of list, a list of words in the field-lists section: the state-config map (199) holds one config index per state, and the random node selector (201) one weight per child node. Their four ordinary lists are empty in every action. Proven · every action of type 199 and 201 The kind of a parameter (boolean, integer, float, vector or property) and its name are not stored; they come from the type and the layout. Sourced · fxr
The four stored lengths (properties 1, properties 2, field words 1, field words 2) are the action’s layout. Types 200,
399 and 500 store nothing, and in Elden Ring neither do 11, 700 and 702; 199 and 201 store only their third list. Proven
Every other type stores the layouts below, one to six per type per game. Each entry is
properties 1, properties 2, field words 1, field words 2 (actions), most common first.
| Type | Sekiro | Elden Ring |
|---|---|---|
| 1 NodeAcceleration | 4, 0, 3, 0 (10,794) | 4, 0, 3, 0 (35,506) |
| 11 Unk11 | - | 0, 0, 0, 0 (33) |
| 15 NodeTranslation | 1, 0, 0, 0 (295) | 1, 0, 1, 0 (869) |
| 34 NodeSpin | 6, 0, 1, 0 (582) | 6, 0, 1, 0 (1,481) |
| 35 StaticNodeTransform | 0, 0, 6, 0 (20,878) | 0, 0, 6, 0 (81,215) |
| 36 RandomNodeTransform | 0, 0, 12, 0 (248) | 0, 0, 12, 0 (1,104) |
| 46 NodeAttachToCamera | 0, 0, 2, 0 (136) | 0, 0, 2, 0 (124) |
| 55 ParticleAcceleration | 3, 0, 2, 0 (4,196) | 3, 0, 2, 0 (17,436) |
| 60 ParticleSpeed | 3, 0, 2, 0 (1,014) | 3, 0, 2, 0 (4,336) |
| 64 ParticleSpeedRandomTurns | 4, 0, 2, 0 (430) | 4, 0, 2, 0 (1,431) |
| 65 ParticleSpeedPartialFollow | 5, 0, 3, 0 (431) | 5, 0, 3, 0 (2,498) |
| 75 NodeSound | 0, 0, 3, 0 (947) | 0, 0, 3, 0 (3,519) |
| 83 NodeAccelerationRandomTurns | 5, 0, 3, 0 (28) | 5, 0, 3, 0 (141) |
| 84 ParticleAccelerationRandomTurns | 4, 0, 2, 0 (988) | 4, 0, 2, 0 (3,254) |
| 105 ParticleAccelerationPartialFollow | 5, 0, 3, 0 (2,616) | 5, 0, 3, 0 (10,364) |
| 106 NodeAccelerationPartialFollow | 6, 0, 4, 0 (1,993) | 6, 0, 4, 0 (2,438) |
| 113 NodeAccelerationSpin | 10, 0, 4, 0 (26) | 10, 0, 4, 0 (117) |
| 120 NodeSpeed | 3, 0, 3, 0 (39) | 3, 0, 3, 0 (84) |
| 121 NodeSpeedRandomTurns | 4, 0, 3, 0 (41) | 4, 0, 3, 0 (185) |
| 122 NodeSpeedPartialFollow | 5, 0, 4, 0 (72) | 5, 0, 4, 0 (53) |
| 123 NodeSpeedSpin | - | 9, 0, 4, 0 (24) |
| 128 NodeAttributes | 1, 0, 4, 0 (21,825) | 1, 0, 4, 0 (88,805) |
| 129 ParticleAttributes | 1, 0, 1, 0 (21,248) | 1, 0, 1, 0 (86,669) |
| 130 Unk130 | 8, 0, 9, 0 (21,248) | 8, 0, 9, 0 (86,669) |
| 131 ParticleModifier | 5, 0, 1, 0 (21,248) | 5, 0, 1, 0 (86,669) |
| 132 SFXReference | 0, 0, 1, 0 (543) | 0, 0, 1, 0 (5,228) |
| 133 LevelsOfDetailThresholds | 1, 0, 5, 0 (125) | 1, 0, 5, 0 (920) |
| 199 StateConfigMap | 0, 0, 0, 0 (20,916) | 0, 0, 0, 0 (88,403) |
| 200 SelectAllNodes | 0, 0, 0, 0 (523) | 0, 0, 0, 0 (2,042) |
| 201 SelectRandomNode | 0, 0, 0, 0 (54) | 0, 0, 0, 0 (94) |
| 300 PeriodicEmitter | 4, 0, 1, 0 (8,740) | 4, 0, 1, 0 (38,788) |
| 301 EqualDistanceEmitter | 3, 0, 2, 0 (1,512) | 3, 0, 2, 0 (2,667) |
| 399 OneTimeEmitter | 0, 0, 0, 0 (11,573) | 0, 0, 0, 0 (47,350) |
| 400 PointEmitterShape | 0, 0, 1, 0 (17,690) | 0, 0, 1, 0 (70,747) |
| 401 DiskEmitterShape | 2, 0, 1, 0 (554) | 2, 0, 1, 0 (2,363) |
| 402 RectangleEmitterShape | 3, 0, 1, 0 (65) | 3, 0, 1, 0 (84) |
| 403 SphereEmitterShape | 1, 0, 1, 0 (451) | 1, 0, 1, 0 (2,202) |
| 404 BoxEmitterShape | 3, 0, 2, 0 (2,640) | 3, 0, 2, 0 (11,682) |
| 405 CylinderEmitterShape | 2, 0, 2, 0 (425) | 2, 0, 3, 0 (1,602), 2, 0, 2, 0 (125) |
| 500 NoSpread | 0, 0, 0, 0 (11,905) | 0, 0, 0, 0 (48,404) |
| 501 CircularSpread | 2, 0, 0, 0 (9,549) | 2, 0, 1, 0 (38,524), 2, 0, 0, 0 (93) |
| 502 EllipticalSpread | 3, 0, 0, 0 (23) | 3, 0, 1, 0 (300) |
| 503 RectangularSpread | 3, 0, 0, 0 (348) | 3, 0, 0, 0 (1,484) |
| 600 PointSprite | 6, 7, 3, 39 (423), 6, 7, 3, 37 (95), 6, 7, 3, 38 (68), 6, 7, 3, 33 (1) | 6, 7, 5, 40 (3,375) |
| 601 Line | 8, 7, 1, 39 (24), 8, 7, 1, 37 (5) | 8, 7, 3, 40 (6) |
| 602 QuadLine | 10, 7, 1, 39 (83), 10, 7, 1, 37 (19), 10, 7, 1, 38 (1) | 10, 7, 3, 40 (2,424) |
| 603 BillboardEx | 25, 7, 15, 43 (6,050), 25, 7, 15, 37 (756), 25, 7, 15, 40 (471), 25, 7, 15, 42 (357), 23, 7, 17, 31 (3), 25, 7, 15, 35 (1) | 25, 7, 18, 45 (15,606), 25, 7, 18, 44 (1,766), 25, 7, 18, 42 (20) |
| 604 MultiTextureBillboardEx | 42, 7, 14, 42 (1,386), 42, 7, 14, 37 (109), 42, 7, 14, 39 (59), 42, 7, 14, 41 (46) | 42, 7, 17, 46 (13,111), 42, 7, 17, 44 (735), 42, 7, 17, 43 (6) |
| 605 Model | 27, 7, 17, 38 (772), 27, 7, 17, 37 (238) | 27, 7, 20, 38 (1,493) |
| 606 LegacyTracer | 16, 7, 14, 39 (233), 16, 7, 14, 37 (30), 16, 7, 14, 38 (19) | 16, 7, 17, 40 (122) |
| 607 Distortion | 17, 7, 12, 39 (156), 17, 7, 12, 37 (11) | 17, 9, 14, 39 (1,357), 17, 7, 14, 39 (2) |
| 608 RadialBlur | 10, 7, 3, 31 (442), 10, 7, 3, 30 (43) | 10, 7, 5, 31 (1,338) |
| 609 PointLight | 10, 5, 2, 29 (707), 10, 5, 2, 26 (82), 10, 5, 2, 28 (40), 10, 2, 2, 25 (5) | 10, 5, 2, 33 (4,486), 10, 5, 2, 31 (513) |
| 700 SimulateTermination | - | 0, 0, 0, 0 (10,884) |
| 701 FadeTermination | - | 1, 0, 0, 0 (288) |
| 702 InstantTermination | - | 0, 0, 0, 0 (844) |
| 731 NodeForceSpeed | - | 2, 0, 1, 0 (14) |
| 732 ParticleForceSpeed | 2, 0, 2, 0 (520) | 2, 0, 2, 0 (923) |
| 733 NodeForceAcceleration | 2, 0, 1, 0 (1) | - |
| 734 ParticleForceAcceleration | 2, 0, 2, 0 (91) | 2, 0, 2, 0 (535) |
| 10000 GPUStandardParticle | 21, 7, 167, 39 (31), 21, 7, 162, 37 (13), 21, 7, 162, 38 (3) | 21, 7, 168, 40 (99) |
| 10001 GPUStandardCorrectParticle | - | 21, 7, 168, 40 (5) |
| 10012 Tracer | 16, 7, 18, 39 (2,034), 16, 7, 17, 38 (34), 16, 7, 17, 37 (33), 16, 7, 18, 38 (22) | 16, 7, 22, 41 (6,410) |
| 10013 WaterInteraction | 0, 0, 5, 0 (51) | 0, 0, 5, 0 (186) |
| 10014 LensFlare | - | 12, 0, 75, 37 (97) |
| 10015 RichModel | - | 27, 7, 26, 38 (2,733), 21, 7, 23, 38 (300), 27, 7, 25, 38 (19) |
| 10100 Unk10100 | 0, 0, 56, 0 (2,910) | 0, 0, 56, 0 (12,005) |
| 10300 WindForce | 1, 0, 61, 0 (76) | 1, 0, 61, 0 (106) |
| 10301 GravityForce | 1, 0, 39, 0 (1) | - |
| 10400 Unk10400 | 0, 0, 65, 0 (2,910) | 0, 0, 65, 0 (12,005) |
| 10500 Unk10500 | 0, 0, 11, 0 (2,168), 0, 0, 10, 0 (735), 0, 0, 9, 0 (7) | 1, 0, 10, 0 (11,979), 0, 0, 11, 0 (26) |
| 11000 SpotLight | 11, 0, 24, 0 (8), 11, 0, 23, 0 (4), 11, 0, 21, 0 (1) | 11, 0, 28, 0 (12), 11, 0, 26, 0 (5) |
Proven · all actions of both installs
A later build of a game appended parameters to the ends of the lists, so within a type a shorter layout names the same parameters as the first entries of a longer one. Inferred · from the lists’ tails, where the longer layouts of one type extend the shorter
Which layout an action has
Section titled “Which layout an action has”The project lists a layout per type for each game it knows (Dark Souls III, Sekiro, Elden Ring, Armored Core 6 and Nightreign). Taking, for each action, the game’s own layout, then the other game’s, then Dark Souls III’s, the first whose two property lists have the stored lengths is the action’s layout, and the stored field lists are prefixes of its words, for every one of the 219,346 Sekiro and 874,404 Elden Ring actions whose type the project gives a layout, but 5 (the billboards and distortions with words past it, below) and the 300 rich models (whose first property list is shorter than any layout’s). Proven · every action of both installs The actions that are not in their game’s own layout:
| Game | Type | Actions | What |
|---|---|---|---|
| Sekiro | 609 point light | 5 | Dark Souls III’s layout (10, 2, 2, 25): no multiplier properties and one more word at index 12 (lights) |
| Sekiro | 603 billboard | 3 | Dark Souls III’s layout (23, 7, 17, 31), with one word past the 30 the project names |
| Elden Ring | 10500 root action | 26 | Sekiro’s layout (0, 0, 11, 0): 11 field words and no property, where Elden Ring’s has 10 words and the rateOfTime property |
| Elden Ring | 607 distortion | 2 | Sekiro’s layout (17, 7, 14, 39), with two words past the 12 the project names in the first list |
| Elden Ring | 10015 rich model | 300 | no layout has their 21 properties in the first list; they fit Elden Ring’s 27 as a prefix |
Proven · every action of both installs So a layout, not the game, decides which parameter names an action has: a Sekiro file can store an older game’s layout and an Elden Ring file Sekiro’s, and the file stores no version for it. Proven Reading every action with the layout so chosen refuses none. The actions that then hold something the project’s names do not cover are the lists of 199 (20,916 and 88,403 actions) and 201 (54 and 94), the 3 Sekiro billboards and the 2 Elden Ring distortions above. Proven · all 15,068 files
Parameters
Section titled “Parameters”For each type and game the project names the entries of the lists and gives each a kind (boolean, integer, float, vector of
two to four floats, or a property of one to four components), a default and, for a property, the argument it is
evaluated at: 0 (constant), the particle’s age, the time since the action became active, the effect time at which the
particle was emitted, or an external value. Sourced · fxr
About half of its entries are placeholders whose names begin unk (words stored but not understood): 747 of the 1,427
entries of the 60 Sekiro layouts it names and 974 of the 1,843 of the 64 Elden Ring layouts. Sourced · fxr
The project presents some stored values in other units or signs than the files hold. These conventions are its editor’s: Sourced · fxr
| Parameter | Stored | Shown by the project |
|---|---|---|
| node offset and rotation (35), offset (36) | x as stored | x negated |
| turn interval (64, 65, 83, 84, 105, 106, 121, 122) | integer | divided by 50 (a count of 1/50 s) |
| follow rotation (65, 105, 106, 122) | boolean | inverted |
| stir speed (607) | radians | degrees |
| fade-out time (10300, 10301), initial simulation time (10500) | integer | divided by 30 (frames at 30 per second) |
| GPU particle (10000, 10001) emission interval, duration, random turn interval | integer | divided by 30 |
| GPU particle angular acceleration Z | radians | degrees |
| GPU particle size and growth with uniform scale | separate X and Y | Y added to X |
| rich model (10015) U and V offsets and speeds | separate parameters | one two-component UV parameter |
| point and spot light multipliers and fade-out time | as stored | scaled (lights) |
Reading the files with the project’s names and layouts, and these conventions, and comparing with the project’s own reading of the same files, gives the same type, the same parameter names and the same value in every parameter of 21,656 Sekiro actions in 334 files and 91,888 Elden Ring actions in 1,246 files (for every type and layout the smallest file holding it, and every tenth file; properties are compared by function, loop, keyframes, tangents and modifiers; the lights, whose multipliers the project scales, are compared separately; the one Sekiro file the project refuses is left out). Observed · 1,580 of the 15,068 files
WindForce
Section titled “WindForce”only in Elden Ring A WindForce action (10300) becomes a force field in the running game, a GXVfxDynamicForceField, which
pushes cloth (wind on cloth). Every one of the 106 WindForce actions of the 12,155
extracted effect files has 61 words in its first list. Observed · Elden Ring The game’s builder copies them into the
field as follows; the meanings are the code’s use of each, and the names in brackets are the field’s members:
Observed · Elden Ring · read from the code of 1.17.3
| Words | Meaning |
|---|---|
| 0 | shape type (2 a box) |
| 2 to 4 | the box’s extents, kept as its minimum and maximum corners |
| 26, 27 | fall-off on (non-zero), fall-off radius |
| 30 | local (non-zero) |
| 31 | the field’s kind |
| 38, 39 | the force multiplier’s minimum and maximum (and their mean) |
| 40, 41 | wave length, wave offset |
| 46 | weight |
| 53 | a frame count, converted to seconds |
| 54 to 57 | gust, its length, scale and offset |
| 58 to 60 | rise, fall and rest |
Words 28, 32, 33, 42, 45, 47 to 52 are also copied, their use not read. Unknown · Elden Ring Six of the 106 actions (in the files 800803, 808003, 808004 and 808007) equal the running field of one recording at every member the force reads; they differ only in the box’s extents. Observed · Elden Ring · one recording
Each frame the field’s appearance sets the force’s minimum, maximum and mean to words 38 and 39 times the action’s force property
times the effect’s scale, and the field’s own update advances a clock c by 10 × dt and, for field kinds 2 and 4, sets
s = 2 × fbm(0.01c, 0.06c + 400, 0.01c + 150), a four-octave improved Perlin noise (frequency × 0.7 and amplitude from 0.5, × 0.54
per octave) over Ken Perlin’s reference permutation (all 512 bytes compared). The force’s amplitude is mean + s × (max − min) / 2.
No random number is drawn for it: the field takes three draws of the effect system’s generator at creation, which nothing of the
force reads. Observed · Elden Ring · read from the code of 1.17.3 The field’s direction is the third row of its transform,
(sin r, 0, cos r) with r the region’s turn in radians, bit for bit the running field’s. Its origin, set once when it is created,
is the box’s centre (the region’s position plus the block offset plus half the box’s height); the force uses only the origin’s x and
z, through dir.x × dx + dir.z × dz. Observed · Elden Ring · one recording A reimplementation of the force gives the game’s
in all 1,499 calls of one recording with the running field’s origin, and in 690 with the box’s centre computed from the layout,
whose x differs from it by 2⁻¹⁹.
Observed · Elden Ring · one recording
Nodes, configs and slots
Section titled “Nodes, configs and slots”Every node of both installs is one of five kinds and holds a fixed set of actions of its own; the ids and kind names are the project’s. Sourced · fxr
| Node | Id | Nodes (Sekiro / Elden Ring) | Own actions | Configs |
|---|---|---|---|---|
| Root | 2000 | 2,913 / 12,155 | the unknown actions 10100, 10400 and 10500, one each (absent in 3 and 150 roots); in Elden Ring termination actions (700, 701, 702: one of them in 11,998 roots, all three in 6) | none |
| Proxy | 2001 | 543 / 5,228 | one SFXReference (132) | none |
| Levels of detail | 2002 | 125 / 920 | one state-config map | one, config id 1002 |
| Basic | 2200 | 20,222 / 85,359 | one state-config map | 1 to 3 (10 in 21 Elden Ring nodes), config id 1004 |
| Node emitter | 2202 | 569 / 2,124 | one state-config map | 1 or 2, config id 1005 |
Proven · every node of both installs Each config has the id its node kind takes: 125 and 920 levels-of-detail configs, 21,248 and 86,669 basic configs and 577 and 2,136 node-emitter configs. Proven
A config holds, for each slot of the project’s, at most one action, and the slots a kind of config holds are fixed:
| Config | Exactly one of | At most one of |
|---|---|---|
| Basic (1004) | Emitter, EmitterShape, DirectionSpread, NodeAttributes (128), ParticleAttributes (129), ParticleModifier (131), Unknown130 | Appearance, NodeAudio, NodeForceMovement, NodeMovement, NodeTransform, ParticleForceMovement, ParticleMovement |
| Node emitter (1005) | Emitter, EmitterShape, DirectionSpread, NodeAttributes, NodeSelector | NodeMovement, NodeTransform |
| Levels of detail (1002) | LevelsOfDetailThresholds |
Proven · every config of both installs Of the 21,248 and 86,669 basic configs, 15,046 and 56,332 hold an appearance (a billboard, point sprite, model, trail, distortion, blur, light, force or any other Appearance type; a config that draws never holds two), 9,675 and 39,319 hold a particle movement and 20,579 and 80,224 a node transform. Proven
An effect has one to ten states: Sekiro’s 2,669 distinct effects have one in 2,585, two in 27 and three in 57; Elden Ring’s 11,912 have one in 11,651, two in 232, three in 11, four in 3, seven in 6, nine in 3 and ten in 6. Proven · distinct effects; copies of an effect are byte-identical
Enumerated parameters
Section titled “Enumerated parameters”The project types 12 of its enumerations on parameters the installs store. Every stored value of each is a member the project names, and no such parameter is animated (each is a constant, or the zero or one function, which are constants). Proven · every enumerated parameter of every file of both installs
| Enumeration | Stored values | Parameters | Members never stored |
|---|---|---|---|
| AttachMode | 0 None, 1 Parent, 2 DummyPoly, 3 ParentTranslation, 4 DummyPolyTranslation | 128, 129 attachment |
none |
| BlendMode | 0 Unk0, 1 Source, 2 Normal, 4 Add, 5 Subtract, 6 Unk6, 7 Unk7 | 600, 601, 602, 603, 604, 605, 606, 607, 608, 10000, 10001, 10012, 10014 blendMode |
3 Multiply |
| DistortionMode | 0 Stir, 1 NormalMap | 607 mode |
2 Twist, 3 Unk3, 4 Unk4 |
| DistortionShape | 0 Rectangle, 1 Hemiellipsoid, 2 Ellipsoid | 607 shape |
none |
| EmitterShape | 1 Box, 2 Box2, 3 Unk3, 4 Cylinder (Sekiro only), 5 Unk5 (Sekiro only) | 10000, 10001 emitterShape |
0 Line |
| ForceVolumeShape | 1 Sphere, 2 Box, 4 SquarePrism (Elden Ring only) | 10300, 10301 shape |
0 Boundless, 3 Cylinder |
| InitialDirection | 0 Emitter, 1 Up, 2 Down, 3 North, 4 LocalUp, 5 LocalDown, 6 LocalNorth | 400, 401, 402, 404, 405 direction |
none |
| ModelOrientationMode | 0 North, 1 CameraPlane, 2 ParticleDirection, 4 GlobalYaw (Sekiro only) | 605 orientation |
3 GlobalPitch, 5 UnkGlobalPitch |
| OrientationMode | 0 South, 1 CameraPlane, 2 LocalSouth, 4 GlobalYaw, 5 East (Elden Ring only), 6 Camera, 7 LocalYaw, 11 Unk11 (Elden Ring only) | 603, 604, 607 orientation |
3 UnkSouth |
| ReflectionMode | 0 None, 1 Radial | 10014 layer1Reflection; 10014 layer2Reflection; 10014 layer3Reflection; 10014 layer4Reflection |
2 Horizontal |
| RichModelOrientationMode | 0 North, 1 CameraPlane, 2 ParticleDirection, 4 GlobalYaw | 10015 orientation |
3 UnkNorth |
| TracerOrientationMode | 0 Travel, 1 LocalZ, 2 Vertical, 3 GlobalX (Elden Ring only), 4 Cross | 606, 10012 orientation |
5 Diagonal |
Proven
A model turned along its travel
Section titled “A model turned along its travel”With orientation 2 (ParticleDirection), the game draws a Model (605) particle with its model’s Y axis on the line the particle travels, and a RichModel (10015) particle with its Z axis on it; the action’s rotation about Z turns the model about that line. Observed · Elden Ring · two frames drawing effect 523022: 26 Model draws and 2 RichModel draws In the captured frames the effect flies along the game’s -Z. Node 11 (Model, model 83050, rotation about X 180 degrees, random rotation about Z, speed -3 along the flight, partly following the emitter) is drawn with the model’s +Y axis pointing forward along the flight in 25 draws and back in the newest particle of one frame, its X and Z axes at random angles across the flight. Node 8 (RichModel, model 84016, moving forward with the emitter, random rotation about Z) is drawn with its +Z axis pointing forward along the flight and its X and Y axes at random angles across it.
Which way the axis points fits a model whose +Y (Model) or +Z (RichModel) is first turned onto the particle’s movement in the world, then by the action’s rotation: the 180 degrees about X reverse the Model’s axis, the older Model particles (at speed -3) move back and the newest, still carried forward by the emitter, moves forward. Inferred · Elden Ring · from the one particle whose axis is reversed In which order the three rotations apply is not shown by these frames: the rotation about Y is 0 in both nodes.
How a model particle’s colour is drawn
Section titled “How a model particle’s colour is drawn”A Model (605) particle whose model’s material is S[A]_add_GXFlver (program GXFlver_Col) adds the texture’s colour times
the particle’s colour (mulCol) times the draw’s FC_DynamicDiffuseColor, and its opacity is the texture’s alpha times the
particle’s alpha times the alpha of the model’s vertex colour indexed 1 (COLOR1.w); the vertex colour’s RGB is not read.
Observed · Elden Ring · a pixel trace of one draw of model 83050 in a captured frame of effect 523022
FC_DynamicDiffuseColor is (20, 20, 20) in those draws: the material binary’s g_DiffuseColor (1, 1, 1) times its
g_DiffuseColorPower (20). Observed · Elden Ring · the constants of the frame’s model draws and the material binary
Model 83050 stores that colour as (1, 0, 1, a), its alpha 0 at 35 of the 175 vertices the draw reads and 0.016 to 1 at the
rest, so the model fades out at its edges. Observed · Elden Ring · the draw’s vertex buffer, each vertex once
The particle’s colour in those draws is the action’s colour and rgbMultiplier times the same frame-wide factor K the frame’s
unlit billboards carry in g_vColorScale (see the effect draws): the ratio
of mulCol to the colour the action’s curves give at each particle’s age is the same in all the frame’s model draws, and
its alpha equals the action’s. Inferred · Elden Ring · the curves evaluated by a reading of the action, not by the game
Against the effect’s billboards a model of this material is therefore 20 times as bright as its colour alone would make it.
A RichModel (10015) particle of the same effect, model 84016 with the material S[ShiningStone] (program S[AMSN]_Glow),
is drawn with blending off, its back faces culled and depth written, and lit: its pixel program reads the environment’s
image-based light and the irradiance volumes. Its textures are the material binary’s samplers’ (albedo s34050_a,
metallic s00003_m, normal s00005_n, emissive s00007_em); the model’s own texture paths are empty.
Observed · Elden Ring · the draw’s state and a pixel trace in two captured frames
The material binary’s g_BlendMode is 0. That the RichModel’s blend is the material’s, the action naming none, fits this
draw; no other RichModel has been captured. Inferred · Elden Ring
Property curves
Section titled “Property curves”The functions of a keyframed property and how their keyframes are stored are on the FXR page.
The project evaluates a property at an argument x as follows. Before the first keyframe it holds the first value and after
the last the last; a looping one takes x modulo the largest keyframe position (not a number when that is 0); keyframes
whose position goes backwards are dropped. Sourced · fxr
- Stepped: the value of the last keyframe at or before
x. - Linear:
v1 + (v2 - v1) * tbetween the keyframes aroundx, witht = (x - p1) / (p2 - p1). - Bezier: the cubic Bezier through the two keys with the control points
v1,v1 + a / 3,v2 - b / 3,v2, whereais the first tangent value of the earlier key andbthe second tangent value of the later one. - Hermite:
v1 + (v2 - v1) * e(t), whereeis built from the tangent angles the file stores, both taken from the earlier keyframe (s1its first,s2its second), withq = pi / 4:
H(m0, m1; u) = (3u^2 - 2u^3) + (u^3 - 2u^2 + u) * m0 + (u^3 - u^2) * m1a(u) = 1 - sqrt(1 - H(0.7, 1.5; u)^2) slow startb(u) = sqrt(1 - (H(1.5, 0.7; u) - 1)^2) slow ende1 = a + (s1 / q) * (u - a) if s1 <= q = u + ((s1 - q) / q) * (b - u) if s1 > qe2 = b + (s2 / q) * (u - b) if s2 <= q = u + ((s2 - q) / q) * (a - u) if s2 > qe(u) = e1 + u * (e2 - e1)The stepped, linear and Bezier forms are the project’s. The Sekiro executable computes a Bezier segment as the cubic Hermite curve through the two keys with the stored tangents, which is the form above. Inferred · Sekiro 1.06 code read, not run The Hermite form is the executable’s own scalar Hermite property function, read from the decompiled image; the project has only an approximation of it, because the files store angles and not tangents, and the angles’ reading (0 flat, 45 degrees a straight line, more steeper) is the code’s. Inferred · Sekiro 1.06 code read, not run Evaluating the files’ keyframed properties both ways at the keyframes, between them and past the ends (up to 60 properties per action type, parameter and function) gives the same value for stepped, linear and Bezier properties to 2e-4 of the largest key value, and for Hermite ones to 5e-3 (the worst of all probes is 4.9e-3): 2,945 Sekiro properties (69 stepped, 2,098 linear, 81 Bezier, 697 Hermite) with 25,675 probe points, and 6,918 Elden Ring ones (142, 4,598, 181, 1,997) with 56,941. A probe at a whole number of loop durations is left out: rounded to a 32-bit float it falls on the other side of the wrap from the project’s double. Observed · 9,863 sampled properties
Property modifiers
Section titled “Property modifiers”A property’s modifiers (the records on the FXR page) vary or scale its value.
Type word A holds the component count minus one in its low two bits and the kind in ((A >> 12) & 3) << 4 | (A >> 4) & 15.
Every modifier of both installs is one of the kinds below, with exactly the field words and conditional properties its
kind needs; only one and four components occur. Proven · every modifier of both installs
| Kind | Number | Field words (c components) | Conditional properties | Sekiro (1 / 4 components) | Elden Ring (1 / 4 components) |
|---|---|---|---|---|---|
| Random delta | 21 | c seeds, c maxima | 0 | 24,949 / 1,662 | - |
| Random range | 24 | c seeds, c minima, c maxima | 0 | - | 105,804 / 7,038 |
| External value 1 | 38 | the external value’s index | 1, the factor | - | 3,164 / 119 |
| External value 2 | 39 | the external value’s index | 1, the factor | - | 294 / - |
| Random fraction | 53 | c seeds, c maxima | 0 | 20,655 / 3 | 113,347 / 82 |
Proven
Sekiro’s files hold the random delta where Elden Ring’s hold the random range, and neither game holds the other’s. Proven
A random delta varies the value by up to max either way, a random range adds a random value between its minimum and
maximum, and a random fraction varies it by up to the fraction max of itself either way, each component from the stream
of its seed. An external-value modifier multiplies the value by the factor, a function of the external value’s own argument;
the second kind is fixed when the effect is created. Sourced · fxr
In Sekiro’s executable the random number is uniform on [−1, 1): the hash’s low 23 bits become the mantissa of a float in [1, 2)
(hash & 0x7FFFFF | 0x3F800000), which is doubled and less 3. A random delta adds that number times max, a random fraction
the value times it times max. Inferred · Sekiro 1.06 code read, not run
Modifiers sit mostly on particle properties. Counted over the distinct effects, the properties with a modifier are, in Sekiro, 14,156
of the 220,410 of billboards (603), 13,612 of the particle modifier (131) and 7,151 of the multi-texture billboard (604), and in
Elden Ring 75,046 of the 673,113 of the multi-texture billboard, 57,540 of the particle modifier and 35,513 of the billboard.
Proven · distinct effects
Files an action names
Section titled “Files an action names”Textures, models, model animations and sounds are named by number. The main texture of a particle and the model of a model
particle are properties (a constant, stored as a float: 1024.0 is texture 1024); every other texture (normal map, specular
parameter map, mask, detail map, the layers of a multi-texture billboard), the animation and the sound are integer field words.
Sourced · fxr
The member that holds a number is in the sfxbnd binders beside the effects (a member in several binders counts once per binder):
| Kind | Member | Sekiro | Elden Ring |
|---|---|---|---|
| texture | sfx/tex/s%05d[_suffix].tpf |
451 members, no suffix for any kind an action asks for | 1,016 members: _a colour, _n normal map, _m specular parameters, _d detail |
| model (mesh particle) | sfx/model/s%05d.flver |
144 | 487 |
| model animation | sfx/hkx/s%05d.anibnd |
3 | 21 |
| resource list | sfx/ResourceList/f%09d.ffxreslist |
none | 12,155, one per effect file |
Proven · every member of the effect binders of both installs
Sekiro’s binders also hold suffixed texture members (_a, _n, _m, _r: 79 ids, one of them named by a texture parameter),
and Elden Ring’s _em, _r, _3m and _1m variants besides the four above (493 texture ids in all, 183 named by a texture parameter). Observed
How many of the numbers named by the constant texture and model parameters are members of the effect binders:
| Parameter | Ids named (Sekiro / Elden Ring) | Members present (Sekiro / Elden Ring) |
|---|---|---|
| colour texture | 203 / 162 | 199 / 157 |
| normal map | 30 / 27 | 29 / 27 |
| specular parameter map | 2 / 1 | 2 / 1 |
| detail map | 2 / 1 | 2 / 1 |
| model | 123 / 473 | 121 / 473 |
Proven · the distinct positive numbers of the constant parameters of all files The numbers that are members of no effect binder are 4 colour textures, 1 normal map and 2 models in Sekiro and 5 colour textures in Elden Ring. Proven
An Elden Ring resource list is a text of file names, one a line, as the authoring tool names them: .tif for a texture
(s00001_a.tif), .sib for a model, .hkt for an animation and _skeleton.hkt for its skeleton, and, for the textures and
models of a map asset that an effect shares, names beginning AET or AEG (AET999_645_a.tif). Every line of all 12,155
lists reads as one of these. Proven
Open questions
Section titled “Open questions”Types 11, 130 (in every basic config), 10100, 10400 and 10500 (in every root) have no name in the project, and about half of
the entries it does name are unk placeholders. The files hold their values; what they mean is not read.
The angles’ meaning and the ease functions come from the executable’s code, not from a running game; no captured particle has been compared with the curve.
A file that stores an older layout has no value for the parameters appended later. Whether the game takes the project’s default, zero or something else is not established.
The external-value modifiers (3,577 in Elden Ring) and the operands of the state conditions name external values by index; which index is which, and what sets it, is not read.
A model particle turned along its travel follows the particle’s movement in the world in the one capture measured, but only one particle distinguishes that from the emitter’s heading. A capture of a model particle that turns, or one left behind by an emitter that stops, would settle it, and would show the order of the rotations.
The one RichModel captured draws opaque and lit, as its material binary’s blend mode 0 and program have it. A capture of a RichModel whose material blends would show whether the action’s words ever choose the blend.
Sekiro’s modifiers are all random delta or random fraction, Elden Ring’s random range, random fraction or external value. Whether the two kinds are the same random variation stored differently, or different variations, is not established.