Menu
 

Effects Documentation

Started by ak2yny, July 26, 2020, 07:31PM

Previous topic - Next topic
July 26, 2020, 07:31PM Last Edit: August 14, 2024, 06:37AM by ak2yny Reason: Added a Full Effects List
I have been working on an effect recently and couldn't find anything that did what I wanted. So I did a lot of testing and documentet my discoveries. I couldn't find many posts on effects, except in Outsider's Guide, so I just start a new topic. I will expand it as I make new discoveries.

The knowledge enabled me to create a whole new effect from scratch. I hope this will enable other modders to do so as well. But be aware that you need a lot of patience for testing, or a good imagination, or both.

I won't cover the basic effect codes. Find them in The Outsider's Guide To Modding.
More: How to : Edit effects of powers



General Information

Most terms in an effect have multiple sets of numbers. If there are more than two, the first set of one or three numbers belong together, and the last set of one or three numbers go together. So there are usually two or six (for xyz and start-mid-end values) numbers. The reason is that you can enter a range. So if you want to place the effect in a random place in front, right, above the character/bolt, you would enter eg. "10 10 10 50 50 50" in the "origin" line. This would be a range from 10-50 [units] in each dimension.

There are generally two formats for the six number-terms: Chronological and Dimensional.
Chronological:The values change as the effect progresses. You can make an effect grow and shrink for example.
                      The format is: end-mid-start(end-mid-start). End and mid values are usually added/subtracted from the start value.
                      If only the start value is entered and end/mid are 0, the terms value will stay constant.
                      They are sometimes absolute, depending on types and/or flags. (Start value is always absolute.)
Dimensional: The values are usually absolute and work in a three-dimensional environment.
                      The format is: X Y Z (X Y Z)
                      They values are sometimes added/subtracted, depending on types and/or flags.

Some values are limited to a certain high/low number. I believe this is +/-10000 and is true for rotation, size, uvscale, uvscroll, endarc, startarc, and some others. You can enter a custom range by entering two numbers AFTER the standard two sets of numbers. This could be 0 10000 for example. It's still possible to use negative numbers in this example though. I haven't yet figured out how a custom range affects an effect.

Capitals or all lowercase doesn't matter (SpawnFlags and spawnflags both work).
It doesn't matter if the order is kept either: Put the terms that go together next to each other (eg. velocity, drag) or sort it alphabetically, everything works.

Effects File Header:
LoopTime = 2.0 ;
> (check Outsider's Guide)
RandLoopTime = 0 ;
> Random additional loop time between 0 and entered number.
> Adds to looptime only. In other words, results in random loop time between number in looptime and randlooptime.
PersistLoop = 0 ;
> No difference. Don't know.


Common Terms

More common terms.

   count = 1 1 ;
   > adds effects/objects with the exact same values. Especially helpful for effects with terms of random/range values.
   delay = 0 0 ;
   > time value, same as LoopTime (so if LoopTime=2 and delay=1 1, the effect shows at halftime)
   life = 1 1 ;
   > time value, same as LoopTime (so if LoopTime=2 and life=1 1, the effect fades at halftime)
   > Considerably higher values than looptime result in the effect increasing in number (on top of each other), the longer it lasts.
   viewoffset = 0 ;
   > shifts the effect, depending on from what angle you view (camera rotation/zoom)
   acceleration = 0 0 0 0 0 0 ;
   acceleration2 = 0 0 0 0 0 0 ;
   gravity = 20 20 ;
   gravity2 = 20 20 ;
   velocity = 0 0 0 0 0 0 ;
   velocity2 = 0 0 0 0 0 0 ;
   drag = 0 0 ;
   drag2 = 0 0 ;
   > These four values work on most effects only and have similar results only.
     They move the origin values and have a second term (eg. gravity2) only if there is an origin2.
     Drag always goes together with velocity. (Sets distance limit for velocity.)


Flags

Think of flags as on/off values. If you've been working with scripts, you've probably encountered gameflags, which are either 0 or 1. The same applies to the flags in effects. Thanks to nikita488, we now are able to test these flags.
I made a spreadsheet where you can paste flag numbers and it converts them so you can see which ones are on. We still only have numbers (0-31) but I hope that we can discover some of their properties with this tool (FX levels have been discoverd).

You can also start Windows Calculator in Windows 10 and switch to Programmer mode (1). Paste any flag number (eg. spawnflag # 4211081216).

Now, turn on bit mode (2). Here we see the 0 and 1 values that tell us what flags are on (value 0) or off. The bottom two rows are used with effect flags (3). Click on the digits to change the flags. The number in the display changes to a new spawnflag number that can now be copied and pasted in the effect file. Each of the 32 bits/digits are a specific flag, that can be turned off (value 1). Some of them deactivate other terms.
Example: Spawnflags can be used to change the effect relocation. If flag 24 is 0, the effect stays on the exact same location until the loop is ended.

Note: Change these first, as they mess with the other values.
          Change flags to 0 to enable everything, and get rid of annoying rotation or positioning.
          Any number works for flags, but you might not be able to uncover what specific flags are on or off.

fxlevel:
Primitiveflags 24 to 31 are the fxlevel, which can be turned off (1) individually. Multiple levels can be on at the same time. Flag 24 is fxlevel 1, flag 31 is fxlevel 8, so there can be up to 8 fxlevels. Fxlevels are off (1) by default, only the chosen level is on (0).
Example for fxlevel 3: (24)1101(28)1111. Example for fxlevels 2-6: (24)1000(28)0011.
This is different in XML2 effects.

   primitiveflags = 256 ;
   > Can stay 0. Usually has a small influence only.
   > MUA effects usually have a high number here, because flags 24-31 are fxlevels (by default off=1, except one level)
   > Eg.: Certain flags result in the effect not being affected by the orientation of the character.
   shaderflags = 0 ;
   > Rarely used.
   spawnflags = 0 ;
   > Important for effect orientation and respawn on long looptime-effects (when moving).
   > Eg.: Turn viewoffset on and off.


Plat

I had this theory for a while, and recently discovered evidence for this in exp_generic_lrg.xmlb: Plat is used to filter the effect(-part) for platforms. The said effect suggests that plat = 23 is for all systems. Plat = 40 is usually found in effect files from MUA 2006 and the said effect suggests, that it is used for higher quality and distort effects. What is certain, is that they have a connection to the video settings/setup. They are typically used on Light effects and effects with distortion textures (normal textures). Plat has a small influence on Light effects, as it makes them slightly stronger or weaker (we can see the connection to the video setup).
With MUA PC, high quality effect parts (typically plat = 40) often don't show when a lot of effects are on the screen, or when particle details are set to low (previously thought to depend on fullscreen effects, but this seems to be wrong). Effects with plat 23 seem to be hidden on MUA PC with high particle details but usually show with low particle details. So, one can switch the effect style on MUA PC 2006 by changing the particle details, and it seems like this can be controlled with the plat property (it might also depend on flags, needs further testing).

Plat = 23:    PS2? (low qualty)
Plat = 31:    Xbox 360? (OCP 1)
Plat = 40:    MUA PC 2006? (high quality)
Plat = 55:    ? (found in some MUA PC 2006 effects)
Plat = 104:  ? (found in some MUA PC 2006 effects)
Plat = 488:  ? (Steam version aka Remaster Edition/RE 2016)
Plat = 1000: ? (Steam version aka Remaster Edition/RE 2016)

IMPORTANT: The plat property is often set in the packages as well. The setup might not work correctly if the property in the packages is incorrect or missing.


Unnecessary Terms

Some terms are used in specific types only (eg. orientaxis in orientet sprites), but some of them are present in all or most effect types. Changing or removing them doesn't affect the effect at all. Here are a few of them:

   radius = 0 0 ;
   radius2 = 0 0 ;
   > Used in particle clouds. AFAIK the only type that uses these. I still don't know if radius2 is used in particle clouds at all.
   rotationaxis = 0 0 0 0 0 0 ;
   > Used in model and sprite/orientet sprite effects. Generally effects that can be oriented.
   acceleration = 0 0 0 0 0 0 ;
   gravity = 0 0 ;
   velocity = 0 0 0 0 0 0 ;
   drag = 0 0 ;
   > Although these four only DO work in most effect types, they are present in all types.

I hope I don't lie to you with this. Changing some terms affects others so much that it is very difficult to fully discover everything.
Because of new discoveries about flags, I think it could be possible, that these can be turned on with flags.




Individual Section

Each effect-file consists of a header (mentioned above) and one or several types of subordinate effects. The types define very much what can be done with these effects. Therefore, I list them (all) here and mention the most important terms for each type.

All possible types as ordered below:



Cylinder

Cylinder effects are used to create invisible cubical forms of various shapes (defined by numsegments, origin, and size values). The form's side(s) can also be used as a canvas for textures (not its top or bottom unfortunately).

define the form:
   numsegments = 0 ;
   > sets the form of the top and bottom. 0 removes it and gives a circle. 4 makes 4 corners = square. 5 = pentagon, etc.
   > If an arc is given, the segments/corners stay the same in numbers, but two corners are used for each end.
     Eg.: A 90° arc with numsegment=3 makes a quarter of an octagon.
   > I will continue this example with a circle/cylinder form.
sectioning circle (slicing the cake):
   startarc = 0 0 5 0 0 5 ;
   endarc = 0 0 6 0 0 6 ;
   > Chronological format
   > Example gives approx. 9° arc, facing slightly to the right where hero faces (0 would be front)
     6.283 (2x Pi) equals 360°, full circle
   > removing results in full circle, 0 0 0 0 0 0 values in both gives 0 size section (no effect)
   > Values limited to +/-10000
   uvscale = 0 0 5 0 0 5 ;
   > Chronological format
   > 3 creates 3 slices of the section defined by start- and endarc
     (actually divides the canvas for texture, rather than the cylinder itself)
   > Values limited to +/-10000
change height of cylinder:
   origin = 0 0 100 0 0 100 ;
   > approx. 1m, top
   origin2 = 0 0 10 0 0 10 ;
   > approx. 0.1m, bottom (lower value is bottom > if origin2 is top [higher value] size2 is top too, note: inverting top and bottom inverts everything else too: front becomes back, left becomes right)
   > 1m - 0.1m = 0.9m height, 0.1m above ground/bolton (approximately)
change radius of circle:
   size = 0 0 100 0 0 100 ;
   > approx. 2m radius, top (if origin2 Z is lower)
   size2 = 0 0 100 0 0 100 ;
   > approx. 2m radius, bottom (if origin2 Z is lower)
   > Chronological format (growth/shrink).
   > Values limited to +/-10000
 Eg. create pulsing form:
   size = -5 5 50 -5 5 50 ;
   size2 = -5 5 50 -5 5 50 ;
rotate cylinder (static):
   origin = 50 0 100 50 0 100 ;
   origin2 = 0 0 100 0 0 100 ;
   > Dimensinal format (check Outsider's Guide)
   > Change the X and Y values of the top or bottom (origin or origin2) to rotate the cylinder.
   > Origin2 is relative to origin. It is possible that it can be changed to absolute with flags.
   > Only changing the X and Y values of both the top AND bottom (origin and origin2), changes the actual origin/position.
turn, tilt, etc. cylinder:
   rotation = 0 0 50 0 0 50 ;
   > Chronological format
   > Speed value: approx. 30 > full circle rotation (in a 1.0 loop-timeframe)
   > Very high values skip some frames. Too high values (10000+) don't work (no rotation).
   rotationradius = 0 0 0 0 0 0 ;
   > Chronological format
   > Slides away from origin, in the direction of the current rotation direction.
rotate texture (canvas):
   uvscroll = 0 0 1 0 0 1 ;
   > Chronological format
   > Speed value: 6.283 makes about 1 rotation (in a 2.0 LoopTime) (negative values invert the rotation direction)
   > first value seems to have no effect. Otherwise is the same as rotation. Moves texture only but the effect is the same.
   > Values limited to +/-10000
move cylinder:
   acceleration = 0 0 0 0 0 0 ;
   > top or bottom circle, according to origin.
   acceleration2 = 0 0 0 0 0 0 ;
   > Chronological format
   > speed value?, moves into x direction
   gravity = 20 20 ;
   gravity2 = 20 20 ;
   > positive values make cylinder lighter, moving it up in z direction (doesn't matter how cylinder is rotated).
   velocity = 0 0 0 0 0 0 ;
   > moves origin
   velocity2 = 0 0 0 0 0 0 ;
   > moves origin2
   > Dimensinal format (both velocity entries). I think the values set the speed, rather than the distance.
   > Note: Turning with velocity doesn't work with a segmented cylinder.
           This doesn't move, but stretch the cylinder.
   drag = 0 0 ;
   drag2 = 0 0 ;
   > Tell the velocity entries how far to travel. Value 0 seems to make it infinite.

Example for an even canvas for textures in front of the character (approx. square), no bolt applied:
XMLB Effect {
LoopTime = 2.0 ;
RandLoopTime = 0 ;
PersistLoop = 0 ;
   Cylinder {
   acceleration = 0 0 0 0 0 0 ;
   acceleration2 = 0 0 0 0 0 0 ;
   alpha = -4 4 0 -4 4 0 ;
   blend = additive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   drag2 = 0 0 ;
   endarc = 0 0 1 0 0 1 ;
   endcolor1 = 13238343 ;
   endcolor2 = 13238343 ;
   gravity = 0 0 ;
   gravity2 = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 3 3 ;
   midcolor1 = 16744576 ;
   midcolor2 = 16744576 ;
   name = circle1 ;
   numsegments = 1 ;
   origin = 0 0 90 0 0 90 ;
   origin2 = 0 0 15 0 0 15 ;
   primitiveflags = 0 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = 0 0 0 0 0 0 ;
   rotationaxis = 0 0 0 0 0 0 ;
   rotationradius =  0 0 0 0 0 0 ;
   shaderflags = 0 ;
   size = 0 0 50 0 0 50 ;
   size2 = 0 0 50 0 0 50 ;
   spawnflags = 256 ;
   startarc = 0 0 -1 0 0 -1 ;
   startcolor1 = 16744576 ;
   startcolor2 = 16744576 ;
   texture = textures/?.png ;
   uvscale = 0 0 1 0 0 1 ;
   uvscroll = 0 0 0 0 0 0 ;
   velocity = 0 0 0 0 0 0 ;
   velocity2 = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}



Light

Creates a light source and reflections of varying colours on surfaces. This effect gets MUCH stronger with multiple light sources (use count).
Light sources CAN vary in size and reflection, but the only way to do so, seems to be with primitiveflags.

light value:
   attenuation = -200 100 100 -200 100 100 ;
   > Chronological format.
   > positive values strengthen the light, negative values dim it.
   > attenuation (and usually plat) have to be set for the effect to be visible.
size:
   size = 0 0 140 0 0 140 ;
   > Has little to no effect. Use light values to change the effects influence.
   > Chronological format.
   > Values limited to +/-10000
position:
   origin = 0 0 100 0 0 100 ;
   acceleration = 0 0 0 0 0 0 ;
   gravity = 20 20 ;
   velocity = 0 0 0 0 0 0 ;
   drag = 0 0 ;
   > These values have little to no effect. For a light to move, it has to be attached to a moving object.
more:
   texture = textures/nextgen/distort_mask1.png ;
   > textures are barely visible and make little difference in a light effect.

Changing primitiveflags changes the reflection (among other things):
   primitiveflags = 4211081216 ;
   primitiveflags2 = 33620224 ;
   > These flags remove all reflections on the walls and the floor.
More examples for primitiveflags might follow.

Example, bright purple light (hidden), with reflections, fading:
XMLB Effect {
looptime = 1 ;
randlooptime = 0 ;
   Light {
   acceleration = 0 0 0 0 0 0 ;
   alpha = -4 4 0 -4 4 0 ;
   attenuation = -200 100 100 -200 100 100 ;
   blend = alpha ;
   count = 2 2 ;
   delay = 0 0 ;
   drag = 0 0 ;
   endcolor1 = 13238343 ;
   endcolor2 = 13238343 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 1 1 ;
   midcolor1 = 16744576 ;
   midcolor2 = 16744576 ;
   name = hd_light ;
   origin = 0 0 30 0 0 30 ;
   plat = 40 ;
   primitiveflags = 0 ;
   primitiveflags2 = 0 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   shaderflags = 0 ;
   size = 0 -1 2 0 -1 2 ;
   spawnflags = 1073741824 ;
   startcolor1 = 16744576 ;
   startcolor2 = 16744576 ;
   texture = textures/nextgen/distort_mask1.png ;
   velocity = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}

More examples of what can be done: Floor reflection of an illuminating object.
                                                            Flashing lights (have to be attached to an object/bolt).



Line

Line effects are used to create straight lines of varying width. The lines originate from the hero, but paint on the screen, rather than in a direction of the hero. Wide lines act as canvas for textures.

change width, create canvas (as opposed to line):
   size = 0 0 140 0 0 140 ;
   > approx. 2m wide
   > Chronological format.
   > Values limited to +/-10000
change line length / canvas height:
   origin = 0 0 100 0 0 100 ;
   origin2 = 0 0 0 0 0 0 ;
   > approx. 2m high (long), lower value is bottom.
     Note: Inverting top and bottom inverts everything else too: front becomes back, left becomes right.
rotate canvas (static):
   origin = 0 0 100 0 0 100 ;
   origin2 = 0 0 10 0 0 10 ;
   > Dimensinal format (check Outsider's Guide).
   > Change the x and y values of the top or bottom (origin or origin2) to rotate the canvas.
   > Changing the x and y values of both the top AND bottom (origin and origin2), changes the actual origin/position.
move texture (canvas):
   uvscroll = 0 0 1 0 0 1 ;
   > Chronological format.
   > Moves the texture from bottom to top (as defined by origin, with positive values) first value seems to have no effect.
   > Values limited to +/-10000
shift/move:
   acceleration = 0 0 0 0 0 0 ;
   acceleration2 = 0 0 0 0 0 0 ;
   > Moves top and bottom, according to origin entry.
   > Dimensinal format. I think the values set the speed, rather than the distance.
   velocity = 0 0 0 0 0 0 ;
   velocity2 = 0 0 0 0 0 0 ;
   > Does the same as acceleration, but much slower.
   > Dimensinal format. I think the values set the speed, rather than the distance.
   > Note: This doesn't move/shift/rotate, but stretch the canvas.
   drag = 0 0 ;
   drag2 = 0 0 ;
   > Tell the velocity entries how far to travel. Value 0 seems to make it infinite.
   gravity = 20 20 ;
   gravity2 = 20 20 ;
   > Positive values make canvas lighter, moving it up in z direction (doesn't matter how positioned).
divide canvas:
   uvscale = 0 0 5 0 0 5 ;
   > Chronological format.
   > Divides the canvas into 5 sections, all full width and from bottom to top (as defined by origin).
   > Values limited to +/-10000

example of stretched texture to 2/2m, hovering above characters head, no bolton set:
XMLB Effect {
LoopTime = 2.0 ;
RandLoopTime = 0 ;
PersistLoop = 0 ;
   Line {
   acceleration = 0 0 0 0 0 0 ;
   acceleration2 = 0 0 0 0 0 0 ;
   alpha = 0 3 0 0 3 0 ;
   blend = additive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   drag2 = 0 0 ;
   endcolor1 = 13238343 ;
   endcolor2 = 13238343 ;
   gravity = 0 0 ;
   gravity2 = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 2.5 2.5 ;
   midcolor1 = 16744576 ;
   midcolor2 = 16744576 ;
   name = circle1 ;
   origin = 0 0 70 0 0 70 ;
   origin2 = 0 0 170 0 0 170 ;
   primitiveflags = 256 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   size = 0 0 140 0 0 140 ;
   spawnflags = 0 ;
   startcolor1 = 16744576 ;
   startcolor2 = 16744576 ;
   texture = textures/?.png ;
   uvscale = 0 0 1 0 0 1 ;
   uvscroll = 0 0 0 0 0 0 ;
   velocity = 0 0 0 0 0 0 ;
   velocity2 = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}

It's possible that, by changing flags, the positioning of line effects can be affected by the characters orientation. This needs to be confirmed though.

July 26, 2020, 07:34PM #1 Last Edit: August 21, 2024, 09:35AM by ak2yny Reason: Better More Particle Cloud Description
Individual Section continued...



Model

Models are just that: models. Any model (igb-file) can be used for this effect (some won't show - not sure what the criteria is). Textures are replaced by models and textures in the model usually show.

form of the model:
   modelname = models/bolton/book.igb ;
   > The only way to give a form to this effect is by the model. There's no way to morph it, only to resize.
   > Notes: Many igb-files work for this, but not all.
            The ones that work best are located in models/effects folder.
            Any path will work though.
changing size and position:
   size = 0 0 100 0 0 100 ;
   > Chronological format.
   > Value 1 is the original size.
   > Values limited to +/-10000
   orientaxis = 1 0 0 1 0 0 ;
   > MUA only.
   > Dimensinal format.
   > Positions the effect in relation to the current position of the character or bolton.
   > X is front (negative is back), y is right (neg. left), z is up (neg. down).
   > No specific distance needed (any value works).
   orient = up ;
   > XML2 only. Same function as orientaxis, but no in-between orientation.
   > valid: up, forward. (presumeably also down, right, left)
move, rotate:
   rotation = 5 0 0 5 0 0 ;
   > Chronological format. I think the values set the speed, rather than the distance.
   > Only works if rotationaxis is given (something else than 0 0 0 0 0 0).
   rotationaxis = 0 1 0 0 1 0 ;
   > Sets an axis for rotation in dimensinal format.
     No specific distance needed (any value works), the axis exists in a 3-dimensional environment...
   > Note: The x y z directions might depend on how the character is positioned, especially when it's used on a bolton.
   rotationradius = 0 0 0 0 0 0 ;
   > Chronological format.
   > Sets an offset to the axis, making the model's origin rotate around the axis, too.
   acceleration = 0 0 0 0 0 0 ;
   > Chronological format.
   > Speed value? Moves origin into (x) direction.
   gravity = 20 20 ;
   > Positive values make model lighter, moving it up in z direction.
   velocity = 0 0 0 0 0 0 ;
   > Dimensinal format.
   > Moves origin like acceleration (but in any direction).
   drag = 0 0 ;
   > Tells the velocity entry how far to travel. Value 0 seems to make it infinite.

Example, book spawning and floating in place:
XMLB Effect {
looptime = 1 ;
randlooptime = 0 ;
   Model {
   acceleration = 0 0 0 0 0 0 ;
   alpha = -2 2 0 -2 2 0 ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   endcolor1 = 13238343 ;
   endcolor2 = 13238343 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 1 1 ;
   midcolor1 = 16744576 ;
   midcolor2 = 16744576 ;
   modelname = models/bolton/book.igb ;
   name = 1_victim_bubble ;
   orientaxis = 1 0 0 1 0 0 ;
   origin = 30 0 0 30 0 0 ;
   primitiveflags = 4261675008 ;
   primitiveflags2 = 33563072 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = 0 0 0 0 0 0 ;
   rotationaxis = 0 0 0 0 0 0 ;
   rotationradius = 0 0 0 0 0 0 ;
   size = 0 0 10 0 0 10 ;
   spawnflags = 0 ;
   startcolor1 = 16744576 ;
   startcolor2 = 16744576 ;
   velocity = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}

Note: Used models have a shadow just like any model in the game.



ParticleCloud

Particle Clouds are clouds of particles/elements, defined by texture and size.

Notes: If spawnflags are not set, the cloud (radius) will always be 0.
          Where there's two entries (e.g. gravity, gravity2) the first entry modifies particles, the second modifies the cloud.
          Size2 and radius2 have no effect. Size changes particles only, and radius changes cloud only.

Unknown/untested terms: transformrotation, plifescale

change cloud size:
   radius = 100 100 ;
   > Sets the cloud size given through a radius around the origin (sphere, 3-dimensional).
   > Particles will generate only on the outermost distance (sphere's shell). There is no difference when changing radius2.
change particle size:
   size = 0 0 100 0 0 100 ;
   > Chronological format (growth/shrink).
   > Values limited to +/-10000
particle modifications:
   numsegments = 0 ;
   > This doesn't change the cloud form (it will always be a sphere), but with less segments, there are less particles spawning.
   > Less than (10) results in less particles, from 1000 the values result in significantly more particles.
   > Note: To add more particles, you can also increase the count value (there you can set a range too).
   acceleration = 0 0 0 0 0 0 ;
   > Chronological format.
   > Moves particles into (x) direction.
   gravity = 100 100 ;
   > No influence.
   velocity = 0 0 0 0 0 0 ;
   > Dimensinal format.
   > Moves the particles.
   drag = 0 0 ;
   > Tells the velocity entry how far to travel. Value 0 seems to make it infinite.
   pspawn = 0 0 ;
   > Controls how frequently particles spawn.
   > Seems to depend on the 'life' (cloud's life) value.
   plife = 1 ;
   > The particles' spawn duration. Same as life, but life is for the cloud and plife is for the particles.
   > A bigger value than life (cloud's life) means a more intense particle effect.
   ptravel = 100 100 ;
   > Lets the particles travel vertically.
   > Like gravity for cloud, but on each particle.
   > Example: Fire from '1 1' to '2 2' makes the flames travel up faster and all the way up, like a more intense fire (thanks to SuperMaster10 for the example)
   > Value 0 0 stops vertical travel and negative values make it travel down (assumingly).
   rotation = 0 0 50 0 0 50 ;
   > Chronological format.
   > This rotates the particles and not the cloud or the particles around the cloud.
cloud modifications:
   acceleration2 = 0 0 0 0 0 0 ;
   > Chronological format.
   > Moves cloud/sphere into (x) direction.
   gravity2 = 100 100 ;
   > Makes the particles float upwards.
   velocity2 = 0 0 0 0 0 0 ;
   > Dimensinal format.
   > Moves cloud/sphere.
   drag2 = 0 0 ;
   > Tells the velocity entry how far to travel. Value 0 seems to make it infinite.
   origin = 0 0 100 0 0 100 ;
   > Dimensinal format (check Outsider's Guide).
   > Set the center of the cloud.

Example, big glowing particles creating a sphere:
XMLB Effect {
looptime = 1 ;
randlooptime = 0 ;
   ParticleCloud {
   acceleration = 0 0 0 0 0 0 ;
   acceleration2 = 0 0 0 0 0 0 ;
   alpha = -4 4 0 -4 4 0 ;
   blend = alphaadditive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   drag2 = 0 0 ;
   endcolor1 = 13238343 ;
   endcolor2 = 13238343 ;
   gravity2 = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 5 1 ;
   midcolor1 = 16744576 ;
   midcolor2 = 16744576 ;
   name = circle1 ;
   numsegments = 1000 ;
   origin = 0 0 0 0 0 0 ;
   plife = 1 ;
   primitiveflags = 0 ;
   primitiveflags2 = 0 ;
   pspawn = 0 0 ;
   ptravel = 100 100 ;
   radius = 50 50 ;
   rotation = 0 0 0 0 0 0 ;
   size = -20 30 5 -20 30 5 ;
   spawnflags = 1090519169 ;
   startcolor1 = 16744576 ;
   startcolor2 = 16744576 ;
   texture = textures/?.png ;
   transformrotation = 0 0 0 0 0 0 ;
   velocity = 0 0 0 0 0 0 ;
   velocity2 = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}



Sprite and OrientedSprite

Sprite effects are used to create all sorts of visuals. They are given form through a texture which can be scaled. Oriented Sprites spawn in relation of how the hero is positioned.

position effect (OrientedSprite only):
   orientaxis = 1 0 0 1 0 0 ;
   > MUA only.
   > Dimensinal format.
   > Positions the effect in relation to the current position of the character or bolton.
   > X is front (negative is back), y is right (neg. left), z is up (neg. down).
   > No specific distance needed (any value works).
   orient = up ;
   > XML2 only. Same function as orientaxis, but no in-between orientation.
   > valid: up, forward. (presumeably also down, right, left)
scale effect (texture), keeps aspect ratio:
   size = 0 0 100 0 0 100 ;
   > Approx. 2m wide and high.
   > Chronological format.
   > Values limited to +/-10000
rotate effect:
   rotation = 5 0 0 5 0 0 ;
   > Chronological format. I think the values set the speed, rather than the distance.
   > Only works if rotationaxis is given (something else than 0 0 0 0 0 0).
   rotationaxis = 0 1 0 0 1 0 ;
   > Sets an axis for rotation in dimensinal format.
   > No specific distance needed (any value works), the axis exists in a 3-dimensional environment...
   > Note: The x y z directions might depend on how the character is positioned,
     especially when it's used on a bolton.
   rotationradius = 0 0 0 0 0 0 ;
   > Chronological format.
   > Sets an offset to the axis, making the texture's origin rotate around the axis, too.
shift/move:
   acceleration = 0 0 0 0 0 0 ;
   > Moves object's origin.
   > Dimensinal format. I think the values set the speed, rather than the distance.
   > I believe, the axis moves with it. Toghether with rotationradis, some pretty interresting effects can be created.
   velocity = 0 0 0 0 0 0 ;
   > Does the same as acceleration.
   > Dimensinal format. I think the values set the speed, rather than the distance.
   drag = 0 0 ;
   > Tells the velocity entry how far to travel. Value 0 seems to make it infinite.
   gravity = 20 20 ;
   > Positive values make it lighter, moving it up in z direction.

Note: There's no origin2, or related (acceleration, velocity, etc), so it can only change its two dimensions together.

Example, slowly rotating texture in front of hero:
XMLB Effect {
LoopTime = 5.0 ;
RandLoopTime = 0 ;
   OrientedSprite {
   acceleration = 0 0 0 0 0 0 ;
   alpha = -4 4 0 -4 4 0 ;
   blend = additive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   endcolor1 = 13238343 ;
   endcolor2 = 13238343 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 6 6 ;
   midcolor1 = 16744576 ;
   midcolor2 = 16744576 ;
   name = circle1 ;
   orientaxis = 1 0 0 1 0 0 ;
   origin = 15 0 50 15 0 50 ;
   primitiveflags = 256 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = -0.5 4 0 -0.5 4 0 ;
   rotationaxis = 1 0 0 1 0 0 ;
   rotationradius = 0 0 0 0 0 0 ;
   size = -5 5 80 -5 5 80 ;
   spawnflags = 0 ;
   startcolor1 = 16744576 ;
   startcolor2 = 16744576 ;
   texture = textures/?.png ;
   velocity = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}



Trail

Trail effects are used to add a trail to a moving object. The effect needs a lot of movement to be visible (set by spawnflags, acceleration, velocity, size, gravity, or/and moving entities/bips/boltons). In combination with a texture you can create diverse moving objects, like whirlwinds, meteor trails, or simply tracer ammunition.

change size of effect:
   size = 0 0 100 0 0 100 ;
   > Chronological format.
   > Values limited to +/-10000
   length = 0 0 5 0 0 5 ;
   > Unsure in what format this is (I think dimensional). Each of the three numbers create a slightly different effect.
   > Depends much on the movement involved. If the trail is on an object with little movement, long trails won't show.
   > Small trails on big objects with little movent create a moving texture with a hardly visible trail.
   > Both values have to be set for the effect to show.
create movement inside the effect:
   spawnflags = 3238002688 ;
   spawnflags = 1944000000 ;
   > The trail effect usually doesn't work without a high spawnflag number
more movement:
   acceleration = 0 0 0 0 0 0 ;
   > Moves origin.
   > Dimensinal format. I think the values set the speed, rather than the distance.
   velocity = 0 0 0 0 0 0 ;
   > Does the same as acceleration, but much slower.
   > Dimensinal format.
   > If you want to reverse the movement in a trail effect, making velocity (or acceleration) values negative might be the way. Thanks Ninja Kyden
   drag = 0 0 ;
   > Tells the velocity entry how far to travel. Value 0 seems to make it infinite.
   gravity = 20 20 ;
   > positive values make it lighter, moving it up in z direction.
   rotation = 0 0 50 0 0 50 ;
   > Chronological format.
   > Rotates effect/texture. Can't set an axis, rotation depends on orientation, given by the object the effect is attached to.
   rotationradius = 0 0 0 0 0 0 ;
   > Chronological format.
   > Moves away from origin, in the direction of the current rotation direction.
multiple textures:
   uvscale = 0 0 5 0 0 5 ;
   > Chronological format.
   > Divides the textue in the effect into multiple smaller ones.
   > Values limited to +/-10000
more:
   offset = 0 0 1000 0 0 1000 ;
   > Not sure what format.
   > Moves the origin. The longer the effect lasts, the more it moves.

Example, hand trail:
XMLB Effect {
looptime = 1 ;
randlooptime = 0 ;
   Trail {
   acceleration = 0 0 0 0 0 0 ;
   alpha = -2 1 1 -2 1 1 ;
   blend = additive ;
   count = 1 1 ;
   delay = 0 0 ;
   drag = 0 0 ;
   endcolor1 = 49151 ;
   endcolor2 = 49151 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   length = 0 0 5 0 0 5 ;
   life = 0.85 0.85 ;
   midcolor1 = 49151 ;
   midcolor2 = 49151 ;
   name = hand_trail ;
   offset = 0 0 0 0 0 0 ;
   origin = 0 0 0 0 0 0 ;
   primitiveflags = 4261675264 ;
   primitiveflags2 = 0 ;
   radius = 0 0 ;
   radius2 = 0 0 ;
   rotation = 0 0 0 0 0 0 ;
   rotationradius = 0 0 0 0 0 0 ;
   shaderflags = 0 ;
   size = 0 0 8 0 0 8 ;
   spawnflags = 3238002688 ;
   startcolor1 = 49151 ;
   startcolor2 = 49151 ;
   texture = textures/speed4.png ;
   uvscale = 0 0 -1 0 0 -1 ;
   velocity = 0 0 0 0 0 0 ;
   viewoffset = 0 ;
   }

}



Empty

Calls another effect. Useful for reducing effect entries in a single effect file. The values of the called effect file are added (e.g. origin value of effects/base/material/explode/exp_generic_sml is added to the origin value of the Empty effect). Some values of both, Empty effect and target effect, seem not to work.
Primitiveflag 12 has to be on (0000 0000 0000 1000 0000 0000 0000 0000 = 4096) - others can be on as well.

Choose effect:
   deathfxfile = effects/char/iceman/special_blockin ;
   > Most values are taken from this effect, but some are added or changed by this effect.
Multiple effects:
   count = 2 3 ;
   > You can set how many effect should appear simultaneously. Can randomize.
   > the second number always added to the first in my tests, i.e. "2 3" actually means 2 to 5.
 randlooptime = 1 ;
   delay = 0 1 ;
   > Both can randomize each effect timing, making this rain-like.
Timing:
 looptime = 1 ;
   > life seems not to work in this. Probably takes the life of the target (deathfxfile) effect file. Change looptime instead.
   > To turn off the effect early, set the life in the target effect file.
Spread:
   radius = 0 0 ;
   radius2 = 0 0 ;
   > the two values set the boundaries that the effect will be spread around the origin.
     If both are used, the smaller values set the inner circle (will not spread between origin and inner circle).
   > Spawnflag 5 (0000 0100 0000 0000 0000 0000 0000 0000 = 32) needs to be enabled.
Movement:
   drag = 0 0 ;
   velocity = 0 0 0 0 0 0 ;
   > Instead of moving, it rotates each effect. 1 velocity rotates by 90°. Adjust drag to increase angle.
   > Dimensinal format.
   > Might have a different effect if velocity is set in the target effect file as well.
   acceleration = 0 0 0 0 0 0 ;
   gravity = 0 0 ;
   > both seem not to work.
   > Might have a different effect if the values are set in the target effect file as well.

Example, hail storm of Cohollow's Storm:
XMLB Effect {
looptime = 1 ;
randlooptime = 0 ;
   Empty {
   acceleration = 0 0 0 0 0 0 ;
   count = 8 10 ;
   deathfxfile = effects/char/storm/p6_projectile ;
   delay = 0 2 ;
   drag = 0 0 ;
   gravity = 0 0 ;
   height = 0 0 ;
   interval = 0 ;
   life = 0 0 ;
   name = name ;
   orient = forward ;
   origin = 0 0 130 0 0 130 ;
   primitiveflags = 4096 ;
   radius = 50 100 ;
   radius2 = 50 100 ;
   spawnflags = 65577 ;
   velocity = 0 0 0 0 0 0 ;
   }

}




Future Updates:

Fallowing terms have not been explored fully and might be updated in the future:

PersistLoop = 0 ;
> My tests so far have found no difference when changing this number.
   acceleration = 0 0 0 0 0 0 ;
   acceleration2 = 0 0 0 0 0 0 ;
   > Always moves in x (or y) direction while gravity moves in z direction, no matter how the effect is positioned and rotated.
     I'm not sure if it's x or y. I believe it's affected by the positioning of the character/bolt though.
     This needs further testing to make sure of these uncertainties.
   height = 0 0 ;
   interval = 0 ;
   > I haven't found any effect that makes use of these two terms yet. Anyone knows what they're here for?
   > Height seems to be used in some particle clouds with the same values as radius.
   length = 0 0 5 0 0 5 ;
   > Unsure in what format this is (I think dimensional). (Used in Trail effects.)
   offset = 0 0 1000 0 0 1000 ;
   > Not sure what format. (Used in Trail effects.)

Additional things that I haven't yet figured out:
- How a custom range affects an effect.
- There are a few more questionmarks and brackets above, that mark things that I'm not certain about.

I appreciate any help and insight on this topic. Also, please correct me if you have discovered something different, or know that something is wrong.

Wow, this is insanely thorough! Great work! I'm sure this will help many modders in the future

This is very helpful.  Thanks for all the research on this.

April 03, 2024, 03:14PM #4 Last Edit: April 03, 2024, 03:22PM by SuperMaster10
So I made some discoveries regaring some values used in Particle Clouds.
Within Human Torch's Boost auras (p6_aura and p7_aura) for the Particle Clouds, which are responsible for the constant flames appearing around him, I found some values starting with p (standing for particle)

ptravel was "ptravel = 1 1" and the flames were kinda rising in place near the ground, changing that up to 2 2, made the flames go all the way up the screen and disappear contniously, like a more intense fire.

Values in between like "1.5" and such can make it go up but not all the way up. One can mess with the values to control how far up they want the power to go.

I assume anything like "0.7" and such will make em go lower and lower, with "0" stopping all travel altogether. But I did not test with values lower than 1.

pspawn (also default value at "1 1" )seems to control how quickly / frequent the effects spawn, if it's bigger than ParticleCloud's life, it'll be slower. And it'll be faster than ParticleCloud's life if it's smaller.

plife affects the life (duration) of the particles themselves specifically, also originally at "1" value.

All these can be tweaked to control the intensity of the flame or other effects created.