Visual Effects using "programmed effects" can now be changed (outside of engine edits) using progfx.2da. This was added in patch 1.80.8193.14.

Note there is no "custom programming" this is a file of parameters for what the engine will understand when using a particular "type" of programmable FX (1 through 13).

You do not have to use the lines defined already to define your additions. Any line can be used for any progfx.2da type, just make sure the Type column is correctly set. For instance you could have all your custom ones start at line 2000 and not have to worry.

You use the visualeffects.2da columns ProgFX_Impact, ProgFX_Duration and ProgFX_Cessation to reference lines in this 2da:

  • ProgFX_Impact - Run once when the VFX is applied
  • ProgFX_Duration - Run continuously while VFX is active
  • ProgFX_Cessation - Run once when VFX is removed

Previously, all the values for these columns were hardcoded. With 8193.14, a new 2DA, progfx.2da is added which contains the definitions for these values.

The progfx effects are grouped by Type. Each progfx Type has different handling within the engine, and the meaning of the parameters depends on the type. Note the Type ID by default is tied to a row number (eg; Type 3 starts at 300) but that no longer has to be the case.

Some Beamdog documentation available here: https://gist.github.com/mtijanic/97f309b8d9262f0cf4f7dfba6618ea6a mostly translated here.

progfx.2da Exceptions

progfx.2da only applies to visualeffects.2da. The problem with this is that vfx_persistent.2da cannot make use of it (this also defines models to use for visuals). There is one line that has a programmed effect - line 7 - blade barrier - applies environmental mapping as per id 2 below. No other lines can have this added, or any other progfx.2da changes.

2DA Contents

Column NameExampleValid ValuesDescription and Notes
LabelBeamLightning
This is just a name for the effect for readability. No effect.
Type11-13

Type ID. Generally the TypeID is tied to the hundreth position in the 2da file itself, eg; Type 3 starts at line 300.

Param1See belowVariesSee below
Param2See belowVariesSee below
Param3See belowVariesSee below
Param4See belowVariesSee below
Param5See belowVariesSee below
Param6See belowVariesSee below
Param7See belowVariesSee below
Param8See belowVariesNone seem to use this one for some reason.

Types Documentation

1: Skin Overlay (barkskin, stoneskin, etc)

This will set the texture of the creature to the given model texture, along with some altering of impact effects.

Column NameExampleValid ValuesDescription and Notes
Type11Set to 1 for this type.
Param1vdu_tex_stoneModel nameModel Name with overlay (vdu_*) 
Param2stone, wood

name of entry in appearancesndset.2da ArmorType column value

IE: stone, wood, scale, ethereal, leather, chitin, plate, chain, crystal

Tied to appearancesndset.2da ArmorType column (and possibly the counterpart weaponsounds.2da) which controls what noises weapons make when hitting it.

Needs testing to see what happens if left blank, or set to an odd value.

Param3354visualeffects.2da lineThe visualeffects.2da line played when the creature under this visual effect is damaged replacing usual "chunk" effects (and is "Medium" sized or larger). VFX_COM_CHUNK_STONE_MEDIUM for petrify.
Param4353visualeffects.2da lineThe visualeffects.2da line played when the creature under this visual effect is damaged replacing the usual "chunk" effects (and is "Small" sized or smaller). VFX_COM_CHUNK_STONE_SMALL for petrify.

Example progfx.2da lines:


IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
1010Stoneskin1vdu_tex_stonestone************************
1020GreaterStoneskin1vdu_tex_grstonestone************************
1030Barkskin1vdu_tex_barkwood************************
1040ShadowSkin1vdu_tex_shadestone************************
1050Petrify1vdu_tex_stonestone354353****************
1060IceSkin1vdu_tex_icestone************************

2: Used for environment mapping

Sets an environment map file to be used by the VFX. The default lines do not actually seem to be used by the default game visual effects, and there doesn't actually appear to be any vdu_envmap_XXX files in the game files. Presumably the default lines are there just in case/show what the game would do by default.

Column NameExampleValid ValuesDescription and Notes
Type22Set to 2 for this type.
Param1vdu_envmap_000Model nameEnvmap Name

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
100EnvMap002vdu_envmap_000****************************
101EnvMap012vdu_envmap_001****************************
102EnvMap022vdu_envmap_002****************************
103EnvMap032vdu_envmap_003****************************
104EnvMap042vdu_envmap_004****************************
105EnvMap052vdu_envmap_005****************************
106EnvMap062vdu_envmap_006****************************
107EnvMap072vdu_envmap_007****************************
108EnvMap082vdu_envmap_008****************************
109EnvMap092vdu_envmap_009****************************
110EnvMap102vdu_envmap_010****************************
111EnvMap112vdu_envmap_011****************************
112EnvMap122vdu_envmap_012****************************
113EnvMap132vdu_envmap_013****************************
114EnvMap142vdu_envmap_014****************************
115EnvMap152vdu_envmap_015****************************
116EnvMap162vdu_envmap_016****************************
117EnvMap172vdu_envmap_017****************************
118EnvMap182vdu_envmap_018****************************
119EnvMap192vdu_envmap_019****************************
120EnvMap202vdu_envmap_020****************************
121EnvMap212vdu_envmap_021****************************
122EnvMap222vdu_envmap_022****************************
123EnvMap232vdu_envmap_023****************************
124EnvMap242vdu_envmap_024****************************
125EnvMap252vdu_envmap_025****************************
126EnvMap262vdu_envmap_026****************************
127EnvMap272vdu_envmap_027****************************
128EnvMap282vdu_envmap_028****************************
129EnvMap292vdu_envmap_029****************************
130EnvMap302vdu_envmap_030****************************
131EnvMap312vdu_envmap_031****************************
132EnvMap322vdu_envmap_032****************************
133EnvMap332vdu_envmap_033****************************
134EnvMap342vdu_envmap_034****************************
135EnvMap352vdu_envmap_035****************************
136EnvMap362vdu_envmap_036****************************
137EnvMap372vdu_envmap_037****************************
138EnvMap382vdu_envmap_038****************************
139EnvMap392vdu_envmap_039****************************
140EnvMap402vdu_envmap_040****************************
141EnvMap412vdu_envmap_041****************************
142EnvMap422vdu_envmap_042****************************
143EnvMap432vdu_envmap_043****************************
144EnvMap442vdu_envmap_044****************************
145EnvMap452vdu_envmap_045****************************
146EnvMap462vdu_envmap_046****************************
147EnvMap472vdu_envmap_047****************************
148EnvMap482vdu_envmap_048****************************
149EnvMap492vdu_envmap_049****************************
150EnvMap502vdu_envmap_050****************************
151EnvMap512vdu_envmap_051****************************
152EnvMap522vdu_envmap_052****************************
153EnvMap532vdu_envmap_053****************************
154EnvMap542vdu_envmap_054****************************
155EnvMap552vdu_envmap_055****************************
156EnvMap562vdu_envmap_056****************************
157EnvMap572vdu_envmap_057****************************
158EnvMap582vdu_envmap_058****************************
159EnvMap592vdu_envmap_059****************************
160EnvMap602vdu_envmap_060****************************
161EnvMap612vdu_envmap_061****************************
162EnvMap622vdu_envmap_062****************************
163EnvMap632vdu_envmap_063****************************
164EnvMap642vdu_envmap_064****************************
165EnvMap652vdu_envmap_065****************************
166EnvMap662vdu_envmap_066****************************
167EnvMap672vdu_envmap_067****************************
168EnvMap682vdu_envmap_068****************************
169EnvMap692vdu_envmap_069****************************
170EnvMap702vdu_envmap_070****************************
171EnvMap712vdu_envmap_071****************************
172EnvMap722vdu_envmap_072****************************
173EnvMap732vdu_envmap_073****************************
174EnvMap742vdu_envmap_074****************************
175EnvMap752vdu_envmap_075****************************
176EnvMap762vdu_envmap_076****************************
177EnvMap772vdu_envmap_077****************************
178EnvMap782vdu_envmap_078****************************
179EnvMap792vdu_envmap_079****************************
180EnvMap802vdu_envmap_080****************************
181EnvMap812vdu_envmap_081****************************
182EnvMap822vdu_envmap_082****************************
183EnvMap832vdu_envmap_083****************************
184EnvMap842vdu_envmap_084****************************
185EnvMap852vdu_envmap_085****************************
186EnvMap862vdu_envmap_086****************************
187EnvMap872vdu_envmap_087****************************
188EnvMap882vdu_envmap_088****************************
189EnvMap892vdu_envmap_089****************************
190EnvMap902vdu_envmap_090****************************
191EnvMap912vdu_envmap_091****************************
192EnvMap922vdu_envmap_092****************************
193EnvMap932vdu_envmap_093****************************
194EnvMap942vdu_envmap_094****************************
195EnvMap952vdu_envmap_095****************************
196EnvMap962vdu_envmap_096****************************
197EnvMap972vdu_envmap_097****************************
198EnvMap982vdu_envmap_098****************************
199EnvMap992vdu_envmap_099****************************

3: Static Glow effects.

Sets a static glow effect to the model affected. This appears to be the same as the "hold tab" hilite (or "highlight") functionality. Of course tab overrides it.

Commonly used for VFX_DUR_AURA_XXX visualeffect lines as ProgFX_Duration, although can be used in ProgFX_Impact as well (eg: VFX_FNF_HIGHLIGHT_FLASH_WHITE)

The glow is constructed using image file fxpa_dot02, which is shared by the tab and mouse/over highlight. Any modification to that image will affect this type of glow. As an example, see Object Hilites

Column NameExampleValid ValuesDescription and Notes
Type33Set to 3 for this type.
Param10.250.0 - 1.0

Amount of Red

Param20.350.0 - 1.0Amount of Green
Param30.50.0 - 1.0Amount of Blue

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
200SelfIllumRed3100********************
201SelfIllumGreen3010********************
202SelfIllumBlue3001********************
203SelfIllumMagenta3101********************
204SelfIllumYellow3110********************
205SelfIllumWhiteFL3111********************
206SelfIllumOrange310.50********************
207SelfIllumBrown30.550.350.17********************
208SelfIllumPurple30.2500.5********************
209SelfIllumCyan3011********************
210SelfIllumDarkGrn300.30********************
211SelfIllumLightGrn30.510.5********************
212SelfIllumDarkRed30.300********************
213SelfIllumLightRed310.50.5********************
214SelfIllumDarkBlu3000.3********************
215SelfIllumLightBlu30.50.51********************
216SelfIllumDarkYlw30.30.30********************
217SelfIllumLightYlw3110.6********************

4: Lighting addition or removal

Lighting models to provide lighting (or remove it - like if blinded!). There are likely a lot of hardcoded relations to these lines used by the game feats like Darkvision or certain effects like Ultra Vision.

Note that visualeffects.2da lines 153 to 180 are hardcoded in as to affect stealth/spot check and for use on the Item Property: Light. The effects are:

  • At night:
    • Without Darkvision or any 153 - 180 lines VFX applied on the spotter, they get -5 to their spot roll
    • With 153 - 180 VFX the hider will get -10 on the the spot DC for creatures spotting them

You can't add more light lines that affect these so either:

  • Remove all the above lines, and stop using Item Property: Light and code up an entirely new set of VFX lines and apply the penalty manually (without overlaps, fun!)
  • Just edit lines 153 to 180 for alterations (eg more colours etc. by taking existing colours out).
  • Add new lines but carefully add the correct penalties when that light will be "top" by searching them and checking the Param4 value since only the brightest tends to apply.

The normal ones appear to be used for ProgFX_Duration

The Fade ones appear to be used for ProgFX_Cessation

Note there are references to the default visions like Dark Vision here, therefore if you alter the progfx.2da or visualeffects.2da line references these effects can apparently be altered when loaded by the engine. May be worth testing.

Column NameExampleValid ValuesDescription and Notes
Type44Set to 4 for this type.
Param1White_5mModel animation name

Animation name of the Param7 model we are using. EG: "White_5M" is that animation node. Doesn't seem to be case sensitive (the model for fx_light_clr has it down as "white_5m")

Param2

1 used for usual duration

-0.31 used for the "cessation" (ie when a light source is removed)

Float

Animation speed. Fading is negative -0.31.

Param30/1BooleanCast shadows or not (5M ones do not by default cast shadows). This overrides the model property of "shadow" set in fx_light_clr.
Param4

13 (Area Blackout / Blind Vision) - When blinded with EffectBlindness or EffectDarkness (which detects Trueseeing or Ultravision, which can skip the blindness), applied using VFX_DUR_BLACKOUT (5)

20 (Lights) - Usual lights (eg; Torches, magical light rings) - various VFX lines, VFX_DUR_LIGHT_*

49 (Ultra Vision) - For countering Darkness (thus is higher), using EffectUltravision, applied using VFX_DUR_ULTRAVISION (244)

50 (Darkness) - applied using VFX_DUR_DARKNESS (1) but we don't think this is used by EFfectDarkness itself.

51 (Darkvision) - The racial feat FEAT_DARKVISION or item property "Darkvision", applied using VFX_DUR_DARKVISION (182)

52 (Low Light Vision) - The racial feat FEAT_LOW_LIGHT_VISION, applied using VFX_DUR_LOWLIGHTVISION (243)

53 (Blind Vision) - Blind Vision appears to be for those without any of the above effects applied. So default "humans" in otherwise dark areas get this. By default actually lights up the area a bit.

TODO: Write a proper "Vision" page to explain the above, with pictures, and how to make alterations to each type.

Integer

20 for the normal lights. It is the Priority of the light. No idea how it relates to other in-game lights (what priority are they by default - eg; a placeable?)

Upon further testing, these values likely only apply to the player's client for determining which light should take priority when there's a light (or absence of) on the player, since only 1 can be shown on the player, and probably has nothing to do with inter-object interactions.

In cases where the priorities are modified and racial vision supersedes other lights on the player, this is only local to the client; if you have 1 light and a racial vision active, the other players will see the light, whereas you'll only see the racial vision (since you had set racial vision priority as higher than the light).

The priority is for what one will get applied if more than one exists on a player. EG: Equipping a torch turns off Darkvision, but a torch does not override Blindness.

The special VFX for different "visions" probably are all used by hardcoded engine calls.

Param51 for Darkness, Darkvision, Blindvision, Low Light Vision else 0Boolean

If this light source comes close enough to another light source, this light should be temporarily removed while in the vicinity.

(This is why racial vision always "turns off" when coming into close contact with any other lights; note that this doesn't have anything to do with only 1 light being allowed to exist on the player at a time.)

Param61 for LightAreaBlackout and FadeLAreaBlackoutBoolean

Beamdog documentation: "Attach to scene".

If 1, removes all lights from the scene when under the Param1 effect. Typically, this means when blinded, remove all lights from the scene and apply Blind_Vision, but as an example, you could also make it so that when somebody has a Red_5m effect on themselves, they only see the red light around them and no other lights in the scene.

Make sure the Non-fade and Fade versions of the light effect in question are the same values, otherwise the area lights won't come back when the effect is removed, or vice versa (likely reversed logic to what you want).

Param7fx_light_clrFX Model nameModel to load that relates to some of the above parameters, specifically Param1 and Param2.

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
300LightWhite5m4White_5m102000fx_light_clr****
301LightWhite10m4White_10m112000fx_light_clr****
302LightWhite15m4White_15m112000fx_light_clr****
303LightWhite20m4White_20m112000fx_light_clr****
304LightBlue5m4Blue_5m102000fx_light_clr****
305LightBlue10m4Blue_10m112000fx_light_clr****
306LightBlue15m4Blue_15m112000fx_light_clr****
307LightBlue20m4Blue_20m112000fx_light_clr****
308LightYellow5m4Yello_5m102000fx_light_clr****
309LightYellow10m4Yello_10m112000fx_light_clr****
310LightYellow15m4Yello_15m112000fx_light_clr****
311LightYellow20m4Yello_20m112000fx_light_clr****
312LightRed5m4Red_5m102000fx_light_clr****
313LightRed10m4Red_10m112000fx_light_clr****
314LightRed15m4Red_15m112000fx_light_clr****
315LightRed20m4Red_20m112000fx_light_clr****
316LightOrange5m4Orng_5m102000fx_light_clr****
317LightOrange10m4Orng_10m112000fx_light_clr****
318LightOrange15m4Orng_15m112000fx_light_clr****
319LightOrange20m4Orng_20m112000fx_light_clr****
320LightPurple5m4Purp_5m102000fx_light_clr****
321LightPurple10m4Purp_10m112000fx_light_clr****
322LightPurple15m4Purp_15m112000fx_light_clr****
323LightPurple20m4Purp_20m112000fx_light_clr****
324LightGreen5m4Gren_5m102000fx_light_clr****
325LightGreen10m4Gren_10m112000fx_light_clr****
326LightGreen15m4Gren_15m112000fx_light_clr****
327LightGreen20m4Gren_20m112000fx_light_clr****
328LightDarkvision4Dark_Vision105110fx_light_clr****
329LightBlindvision4Blind_Vision105310fx_light_clr****
330LightLowLightVisn4Low_Light_Vision105210fx_light_clr****
331LightUltravision4Ultra_Vision104900fx_light_clr****
332LightDarkness4darkness105010fx_light_clr****
333LightAreaBlackout4Blind_Vision101301fx_light_clr****
350FadeLWhite5m4White_5m-0.3102000fx_light_clr****
351FadeLWhite10m4White_10m-0.3112000fx_light_clr****
352FadeLWhite15m4White_15m-0.3112000fx_light_clr****
353FadeLWhite20m4White_20m-0.3112000fx_light_clr****
354FadeLBlue5m4Blue_5m-0.3102000fx_light_clr****
355FadeLBlue10m4Blue_10m-0.3112000fx_light_clr****
356FadeLBlue15m4Blue_15m-0.3112000fx_light_clr****
357FadeLBlue20m4Blue_20m-0.3112000fx_light_clr****
358FadeLYellow5m4Yello_5m-0.3102000fx_light_clr****
359FadeLYellow10m4Yello_10m-0.3112000fx_light_clr****
360FadeLYellow15m4Yello_15m-0.3112000fx_light_clr****
361FadeLYellow20m4Yello_20m-0.3112000fx_light_clr****
362FadeLRed5m4Red_5m-0.3102000fx_light_clr****
363FadeLRed10m4Red_10m-0.3112000fx_light_clr****
364FadeLRed15m4Red_15m-0.3112000fx_light_clr****
365FadeLRed20m4Red_20m-0.3112000fx_light_clr****
366FadeLOrange5m4Orng_5m-0.3102000fx_light_clr****
367FadeLOrange10m4Orng_10m-0.3112000fx_light_clr****
368FadeLOrange15m4Orng_15m-0.3112000fx_light_clr****
369FadeLOrange20m4Orng_20m-0.3112000fx_light_clr****
370FadeLPurple5m4Purp_5m-0.3102000fx_light_clr****
371FadeLPurple10m4Purp_10m-0.3112000fx_light_clr****
372FadeLPurple15m4Purp_15m-0.3112000fx_light_clr****
373FadeLPurple20m4Purp_20m-0.3112000fx_light_clr****
374FadeLGreen5m4Gren_5m-0.3102000fx_light_clr****
375FadeLGreen10m4Gren_10m-0.3112000fx_light_clr****
376FadeLGreen15m4Gren_15m-0.3112000fx_light_clr****
377FadeLGreen20m4Gren_20m-0.3112000fx_light_clr****
378FadeLDarkvision4Dark_Vision-0.3105110fx_light_clr****
379FadeLBlindvision4Blind_Vision-0.3105310fx_light_clr****
380FadeLLowLightVisn4Low_Light_Vision-0.3105210fx_light_clr****
381FadeLUltravision4Ultra_Vision-0.3104900fx_light_clr****
382FadeLDarkness4darkness-0.3105010fx_light_clr****
383FadeLAreaBlackout4Blind_Vision-0.3101301fx_light_clr****


5: Alpha transparency modifiers.

These are used to apply VFX_DUR_INVISIBILITY, VFX_DUR_GHOSTLY_VISAGE, VFX_DUR_GLOW_ and a few others as ProgFX_Duration.

Since there is no model mentioned it's just a alpha and colour change.

Column NameExampleValid ValuesDescription and Notes
Type55Set to 5 for this type.
Param10, 0.5, 0.001Float 0.0 - 1.0

Amount of transparency (lower bound). Can be 0 as per cutscene invisibility or low values like 0.001 it seems

0.0 is a special value for Cutscene Invisibility and applies and removes some special states (ie the invisibility is "full on" the model removed even for the player if applied to them) - it might or might not remove the TAB popover however (is meant for cutscene mode where the player can't press this).

Param2-1, 0.25, 0.5, 0, 1 etc.Float -1 or 0.0 - 1.0Red value (if -1 then ignore colours and keep original?)
Param30, 0.25, 0.4, 0.96 etc.Float 0.0 - 1.0Green value
Param41, 0.25, 0.5 etc.Float 0.0 - 1.0Blue value
Param50, 1000, 6000MillisecondsTime between fades presumably, if 0 just does a permanent consistent visual effect.
Param60, 1, 0.80Float 0.0 - 1.0Amount of transparency (upper bound). If we're fading (Param5) we go towards this value, then presumably back to Param1 value. EG: VFX_DUR_GHOSTLY_PULSE does 0.001 transparency (nearly not there) to 1 (entirely there) over 6 seconds then would do 6 seconds back again.

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8VFX example
400Alpha50.5-10000********VFX_DUR_INVISIBILITY
401AlphaPulse50.001-10060001********VFX_DUR_GHOSTLY_PULSE
402AlphaLightBlue50.50.250.25100********VFX_DUR_GHOSTLY_VISAGE, VFX_DUR_GLOW_LIGHT_BLUE / VFX_DUR_GHOSTLY_VISAGE_NO_SOUND (no sounds)
403AlphaPurple50.50.50100********VFX_DUR_ETHEREAL_VISAGE, VFX_DUR_GLOW_PURPLE (no sounds)
404AlphaQuickPulse50.3-10010000.8********VFX_DUR_GHOSTLY_PULSE_QUICK
405AlphaCutsceneInv50-10000********VFX_DUR_CUTSCENE_INVISIBILITY
406AlphaBlue50.5000.7500********VFX_DUR_GLOW_BLUE
407AlphaRed50.510000********VFX_DUR_GLOW_RED
408AlphaLightRed50.510.40.400********VFX_DUR_GLOW_LIGHT_RED
409AlphaYellow50.510.96000********VFX_DUR_GLOW_YELLOW
410AlphaLightYellow50.510.960.300********VFX_DUR_GLOW_LIGHT_YELLOW
411AlphaGreen50.500.75000********VFX_DUR_GLOW_GREEN
412AlphaLightGreen50.50.510.500********VFX_DUR_GLOW_LIGHT_GREEN
413AlphaOrange50.510.35000********VFX_DUR_GLOW_ORANGE
414AlphaLightOrange50.510.550.2500********VFX_DUR_GLOW_LIGHT_ORANGE
415AlphaBrown50.50.250.12000********VFX_DUR_GLOW_BROWN
416AlphaLightBrown50.50.370.240.1200********VFX_DUR_GLOW_LIGHT_BROWN
417AlphaGrey50.50.50.50.500********VFX_DUR_GLOW_GREY
418AlphaWhite50.511100********VFX_DUR_GLOW_WHITE
419AlphaLightPurple50.50.750.35100********VFX_DUR_GLOW_LIGHT_PURPLE
420AlphaGhost50.4-10000********VFX_DUR_GHOST_TRANSPARENT

6: Pulsing Aura glows - fades between 2 colors

Pulses two colours on the given model. This is used for VFX_DUR_BLUR and VFX_DUR_AURA_PULSE_XXX_YYY visualeffects.2da lines.

Column NameExampleValid ValuesDescription and Notes
Type66Set to 6 for this type.
Param11, 0.25, 0Float 0.0 - 1.0First colour; Amount of Red
Param21, 0.5, 0Float 0.0 - 1.0First colour; Amount of Green
Param31, 0.17, 0Float 0.0 - 1.0First colour; Amount of Blue
Param41, 0.82, 0Float 0.0 - 1.0Second colour; Amount of Red
Param51, 0.1, 0Float 0.0 - 1.0Second colour; Amount of Green
Param61, 0.83, 0Float 0.0 - 1.0Second colour; Amount of Blue
Param71000Milliseconds amountPresumably the amount of seconds to go from the first colour to the second colour. Once reached the second colour it takes the same amount of time to fade back to the first.

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8VFX example
500SIP_RedWhite61001111000****VFX_DUR_AURA_PULSE_RED_WHITE
501SIP_BlueWhite60011111000****VFX_DUR_BLUR, VFX_DUR_AURA_PULSE_BLUE_WHITE (no sound)
502SIP_GreenWhite60101111000****VFX_DUR_AURA_PULSE_GREEN_WHITE
503SIP_YellowWhite61101111000****VFX_DUR_AURA_PULSE_YELLOW_WHITE
504SIP_MagentaWhite61011111000****VFX_DUR_AURA_PULSE_MAGENTA_WHITE
505SIP_CyanWhite60111111000****VFX_DUR_AURA_PULSE_CYAN_WHITE
506SIP_OrangeWhite610.501111000****VFX_DUR_AURA_PULSE_ORANGE_WHITE
507SIP_BrownWhite60.550.350.170.820.710.551000****VFX_DUR_AURA_PULSE_BROWN_WHITE
508SIP_PurpleWhite60.2500.50.730.330.831000****VFX_DUR_AURA_PULSE_PURPLE_WHITE
509SIP_GreyWhite60.50.50.51111000****VFX_DUR_AURA_PULSE_GREY_WHITE
510SIP_GreyBlack60000.10.10.11000****VFX_DUR_AURA_PULSE_GREY_BLACK
511SIP_BlueGreen60010101000****VFX_DUR_AURA_PULSE_BLUE_GREEN
512SIP_RedBlue61000011000****VFX_DUR_AURA_PULSE_RED_BLUE
513SIP_RedYellow61001101000****VFX_DUR_AURA_PULSE_RED_YELLOW
514SIP_GreenYellow60101101000****VFX_DUR_AURA_PULSE_GREEN_YELLOW
515SIP_RedGreen61000101000****VFX_DUR_AURA_PULSE_RED_GREEN
516SIP_BlueYellow60011101000****VFX_DUR_AURA_PULSE_BLUE_YELLOW
517SIP_BlueBlack60010001000****VFX_DUR_AURA_PULSE_BLUE_BLACK
518SIP_RedBlack61000001000****VFX_DUR_AURA_PULSE_RED_BLACK
519SIP_GreenBlack60100001000****VFX_DUR_AURA_PULSE_GREEN_BLACK
520SIP_YellowBlack61100001000****VFX_DUR_AURA_PULSE_YELLOW_BLACK
521SIP_MagentaBlack61010001000****VFX_DUR_AURA_PULSE_MAGENTA_BLACK
522SIP_CyanBlack60110001000****VFX_DUR_AURA_PULSE_CYAN_BLACK
523SIP_OrangeBlack610.500001000****VFX_DUR_AURA_PULSE_ORANGE_BLACK
524SIP_BrownBlack60.550.350.170001000****VFX_DUR_AURA_PULSE_BROWN_BLACK
525SIP_PurpleBlack60.2510.50001000****VFX_DUR_AURA_PULSE_PURPLE_BLACK
526SIP_CyanGreen60110101000****VFX_DUR_AURA_PULSE_CYAN_GREEN
527SIP_CyanBlue60110011000****VFX_DUR_AURA_PULSE_CYAN_BLUE
528SIP_CyanRed60111001000****VFX_DUR_AURA_PULSE_CYAN_RED
529SIP_CyanYellow60111101000****VFX_DUR_AURA_PULSE_CYAN_YELLOW
530SIP_MagentaBlue61010011000****VFX_DUR_AURA_PULSE_MAGENTA_BLUE
531SIP_MagentaRed61011001000****VFX_DUR_AURA_PULSE_MAGENTA_RED
532SIP_MagentaGreen61010101000****VFX_DUR_AURA_PULSE_MAGENTA_GREEN
533SIP_MagentaYellow61011101000****VFX_DUR_AURA_PULSE_MAGENTA_YELLOW
534SIP_RedOrange610110.501000****VFX_DUR_AURA_PULSE_RED_ORANGE
535SIP_YellowOrange611010.501000****VFX_DUR_AURA_PULSE_YELLOW_ORANGE

7: Beams

Within original content, beams are used solely for EffectBeam which adds nwscript parameters for the "source" and "target" (so you can do a penagram on the ground if you wanted).

What this actually does is more useful than it sounds. One type of emitter is a point-to-point emitter (P2P) which moves a visual effect along a track from source to target point. There are three types of P2P emitter available within NWN.

1) Bezier

2) Gravity

3) Lightning

Beams within original content use the lighting emitter type in which a series of lightning decal graphics is placed along a line from source to target. The number of decals placed is dependent upon the builder, but the number must be a binary number (2, 4, 8. 16, 32, 64, etc.). Each decal is overlapped slightly, and options within the lighting type allow you to kink the lightning by skewing each decal in the line. No kink produces a straight beam appearance.

The other two P2P effects toss out emitted decals or chunks at the source, and they migrate toward the target point. Normally, the target point is defined by an AuroraRef dummy within the MDL file (the position of the  dummy is often backward from where the emitted particles will go). However, with the Beam progFx, what you're doing is having the engine detach the beam target from that AuroraRef and place it on the location of the target object. This allows you to now use both Bezier and Gravity "beams" in P2P ways with the target object being the actual target. You're no longer confined to lightning type emitters.

Note: the AuroraRef node is NOT being moved to the target object. If you parent parts of the mesh to the AuroraRef dummy, they will remain where they were in the original MDL layout. What is actually happening is the target point is being removed from the dummy and placed on the target object.

The main thing here is the model is now unhardcoded - go mad adding your own (by editing the existing even).

Column NameExampleValid ValuesDescription and Notes
Type77Set to 7 for this type.
Param1

vdu_beam000

vim_rayfire

Model resref nameVisual effect model resref name
Param2cast01Animation name ?This appears to be the animation name to play on the VFX - cast01 only ever appears in vim_lashfire so presumably used to activate the animation when the beam starts. Therefore have a look at vim_lashfire for an example of this usage.

Question: does default to cast01 if nothing is specified/something invalid is used? If it is missing it presumably just does nothing.

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8VFX exampleSilent VFX
600BeamLightning7vdu_beam000cast01************************VFX_BEAM_LIGHTNINGVFX_BEAM_SILENT_LIGHTNING
601BeamRayFire7vim_rayfirecast01************************VFX_BEAM_FIREVFX_BEAM_SILENT_FIRE
602BeamRayCold7vim_raycoldcast01************************VFX_BEAM_COLDVFX_BEAM_SILENT_COLD
603BeamRayHoly7vim_rayholycast01************************VFX_BEAM_HOLYVFX_BEAM_SILENT_HOLY
604BeamRayMind7vim_raymindcast01************************VFX_BEAM_MINDVFX_BEAM_SILENT_MIND
605BeamRayEvil7vim_rayevilcast01************************VFX_BEAM_EVILVFX_BEAM_SILENT_EVIL
606BeamRayOdd7vim_rayoddcast01************************VFX_BEAM_ODDVFX_BEAM_SILENT_ODD
607BeamFireLash7vim_lashfirecast01************************VFX_BEAM_FIRE_LASH
608BeamFlame7vim_rayflamecast01************************VFX_BEAM_FLAME
609BeamDisintegrate7vim_raydisintacast01************************VFX_BEAM_DISINTEGRATE
610BeamBlack7vim_rayblackcast01************************VFX_BEAM_BLACK
611BeamChain7vim_raychaincast01************************VFX_BEAM_CHAIN
612BeamRayFireW7vim_rayfire_wcast01************************VFX_BEAM_FIRE_WVFX_BEAM_FIRE_W_SILENT


8: Stops models rendering

This would obviously remove the model from view, there appears to be no parameters so there is likely no reason to create duplicates of this line, but reference ID 700 to use it.

Used on visualeffects.2da line 120 - VFX_COM_UNLOAD_MODEL with the entry being tied to ProgFX_Impact. It's unknown if the game uses this VFX line or the 700 progfx.2da line at all (VFX_COM_ are instantly applied "combat" effects...but what would make a model disappear?).

Presumably a good one to use if you want another VFX to apply such as "blowing up a target" where if the model was still there it'd look weird.

The lexicon suggests this does nothing however. Possibly it only works in certain circumstances? Also how would you remove the fact the model is now gone? (possibly some SetAppearance calls may work but better be sure if using this!).

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
700DeleteModel8********************************

9: Chunk Model

VFX_COM_GIB uses this for it's ProgFX_Impact. This is likely the engines hardcoded high violence chunking - when like EffectDeath is used with bSpecacularDeath or similar (see notes here).

Since there are no parameters presumably we cannot force a particular chunk to be used. Using VFX_COM_GIB in EffectVisualEffect may also be buggy and it might be just only usable by the game engine itself not via. scripting or VFX lines.

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
800ChunkModel9********************************

10: MIRV (projectiles like Magic Missile)

Magic Missiles and Acid Arrows! The models can now be changed/new ones be added and the speed and projectile type can be changed. The MIRVs are randomised in direction if using certain projectile types.

This allows you to have fireballs throw from the ImpactScript for instance instead of being part of the spells.2da line definition or using wonky ActionCastSpellAtObject parameters (which miss a lot of projectile types).

Note: After testing even the slowest speeds here (log) tends to be much too fast - especially for "Spiral" (used for Hellball) where it messes up entirely. Needs more speeds to be effective for longer duration projectile types.

log nwscript code (magic missile, the slowest):

    float fDist = GetDistanceBetween(OBJECT_SELF, oTarget);
    float fDelay = fDist/(3.0 * log(fDist) + 2.0);
eg: fDist = 20.0f: 3.38 seconds

llnear nwscript code (will do a linear distance calculation. This is modified from acid arrow twice but is twice as fast):

    float fDist = GetDistanceToObject(oTarget);
    float fDelay = (fDist/50.0);

linear2 nwscript code (acid arrow, linear half speed):

    float fDist = GetDistanceToObject(oTarget);
    float fDelay = (fDist/25.0);

Note these are used in the ProgFX_Impact (eg; VFX_IMP_MIRV) it is an "instant" effect but with a visual that goes on. So you have to delay each hit by a certain amount to get the right "impact time" to, say, do damage.

Column NameExampleValid ValuesDescription and Notes
Type1010Set to 10 for this type.
Param1

vpr_magmisl

Model resref nameVisual effect model resref name
Param2340spells.2da line...for some reason

340? It's line SHADES_Cone_of_Cold in spells.2da which is random. But confirmed by Beamdog it's the spells.2da line - which presumably is used to load spells.2da info of the projectile (although if EffectVisualEffect creates the projectile it probably already has that info loaded?)

It is likely best to leave this as 340 to not have any issues, or set it to a line with no Projectile information (which 340 doesn't have).

After testing setting it to a line with any projectile info doesn't do anything either. Probably unused by the game.

Param30, 2
const int PROJECTILE_ORIENTATION_TYPE_NONE    = 0;
const int PROJECTILE_ORIENTATION_TYPE_TARGET  = 1;
const int PROJECTILE_ORIENTATION_TYPE_PATH    = 2;

Orientation - if needed. 0 if Magic Missile or Electric Magic Missile, 2 otherwise (arrows and darts).

Param44, 1
const int PROJECTILE_PATH_TYPE_DEFAULT                = 0;
const int PROJECTILE_PATH_TYPE_HOMING                 = 1;
const int PROJECTILE_PATH_TYPE_BALLISTIC              = 2;
const int PROJECTILE_PATH_TYPE_HIGH_BALLISTIC         = 3;
const int PROJECTILE_PATH_TYPE_BURST_UP               = 4;
const int PROJECTILE_PATH_TYPE_ACCELERATING           = 5;
const int PROJECTILE_PATH_TYPE_SPIRAL                 = 6;
const int PROJECTILE_PATH_TYPE_LINKED                 = 7;
const int PROJECTILE_PATH_TYPE_BOUNCE                 = 8;
const int PROJECTILE_PATH_TYPE_BURST                  = 9;
const int PROJECTILE_PATH_TYPE_LINKED_BURST_UP        = 10;
const int PROJECTILE_PATH_TYPE_TRIPLE_BALLISTIC_HIT   = 11;
const int PROJECTILE_PATH_TYPE_TRIPLE_BALLISTIC_MISS  = 12;
const int PROJECTILE_PATH_TYPE_DOUBLE_BALLISTIC       = 13;

Seems to be PROJECTILE_PATH_HOMING (1) for Acid Arrow and PROJECTILE_PATH_ACCELERATING (4) for Magic Missiles.

The values to the left are what the different options are. The travel time is controlled by Param5.

Param5log, linear2

log

linear

linear2

The distance caluclation that you can then use in spell scripts to time impacts and damage. See above for nwscript info.

"log" time to target scales logarithmically; "linear" scales linearly; "linear2" scales linearly, half speed;

If left blank appears to use "log" as a default.

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8ProgFX_Impact VFX
900MirvMagicMissile10vpr_magmisl34004log************VFX_IMP_MIRV
901MirvFlameArrow10vpr_arofire34024log************VFX_IMP_MIRV_FLAME
902MirvAcidArrow10vpr_aroacid34021linear2************VFX_IMP_MIRV_ACID_ARROW
903MirvNormalArrow10wamar_00134024log************NORMAL_ARROW
904MirvNormalDart10wthdt_00134024log************NORMAL_DART
905MirvElectro10vpr_ectoelectric34004log************VFX_IMP_MIRV_ELECTRIC

11: Variant MIRV with sound and impact sound (Only used for moo cows / cheat)

Not sure how useful this is since it's used by the engine for the cheat command, and it doesn't have the same parameters as the MIRV options.

The most useful thing may be Param2 which is a one-off "source" sound (from when the projectile starts) so could be a crossbow going off or something for a bolt to appear.

I'm not sure what the distance / time calculations if using this is. Cows move in weird ways...!

Column NameExampleValid ValuesDescription and Notes
Type1111Set to 11 for this type.
Param1

vpr_kngpow

Model resref nameVisual effect model resref name
Param2c_cow_atk1Sound resref nameOne off sound when used, as an "Initial Sound". Sound itself doesn't repeat only fires once from source of VFX.
Param3c_cow_deadSound resref nameLikely the same as "SoundImpact" column in visualeffects.2da entry.
Param44

Projectile Type:

const int PROJECTILE_PATH_TYPE_DEFAULT                = 0;
const int PROJECTILE_PATH_TYPE_HOMING                 = 1;
const int PROJECTILE_PATH_TYPE_BALLISTIC              = 2;
const int PROJECTILE_PATH_TYPE_HIGH_BALLISTIC         = 3;
const int PROJECTILE_PATH_TYPE_BURST_UP               = 4;
const int PROJECTILE_PATH_TYPE_ACCELERATING           = 5;
const int PROJECTILE_PATH_TYPE_SPIRAL                 = 6;
const int PROJECTILE_PATH_TYPE_LINKED                 = 7;
const int PROJECTILE_PATH_TYPE_BOUNCE                 = 8;
const int PROJECTILE_PATH_TYPE_BURST                  = 9;
const int PROJECTILE_PATH_TYPE_LINKED_BURST_UP        = 10;
const int PROJECTILE_PATH_TYPE_TRIPLE_BALLISTIC_HIT   = 11;
const int PROJECTILE_PATH_TYPE_TRIPLE_BALLISTIC_MISS  = 12;
const int PROJECTILE_PATH_TYPE_DOUBLE_BALLISTIC       = 13;

Since you can't specify a travel time this must be set, presumably to "log" but might be something slightly different - needs testing (cows are weird).

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
1100CheatCow11vpr_kngpowc_cow_atk1c_cow_dead4****************

12: Spell Casting Failures - model node attached VFX

By default these are used in the VFX lines VFX_FNF_SPELL_FAIL_HEAD and VFX_FNF_SPELL_FAIL_HAND. Those VFX lines are hardcoded so the default progfx.2da lines should usually remain unaltered.

For new lines you can add a VFX model to any node of the object being applied to. For instance if you have a "CatCollar" node you can have the VFX attach to it.

Obviously there are some limitations:

  • Weapons are not part of the creatures model so the node names of them are unavailable (and sadly you can't apply a VFX to a weapon object easily - but iprp_visualfx.2da is a possible fix there - even if it's very cumbersome!)
  • The node automatically moves with the model but does not adhere to OrientWithGround or OrientWithObject columns in visualeffects.2da - the VFX model itself must be coded to default to one of these modes if required

Examples of things that could be done:

  • Flaming hands
  • Head VFX (ghost rider style!)
  • Better orientated/positioned lights for torches
  • Any kind of attached items or hair or asscessories. You can adjust the location with the parameters in EffectVisualEffect script command.

See also:

Column NameExampleValid ValuesDescription and Notes
Type1212Set to 12 for this type.
Param1

headconjure

handconjure

Model target node name

A model node since these are listed in .mdl files for creatures so the source of where the VFX will go

Note if **** then the VFX fails to display (but the game doesn't crash).

Param2vimspellfailMDL VFX resrefThe VFX file to play

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
1200VisualHeadFail12headconjurevim_spellfail************************
1201VisualHandFail12handconjurevim_spellfail************************

13: Freeze Animations

This would obviously just freeze animations. There are no parameters so there is likely no reason to create duplicates of this line, but reference ID 1300 to use it. The VFX line used by default is VFX_DUR_FREEZE_ANIMATIONS.

Example progfx.2da lines:

IDLabelTypeParam1Param2Param3Param4Param5Param6Param7Param8
1300FreezeAnimations13********************************
  • No labels