You can find more information on the Spells and Abilities page which will outline how to use this 2da file.

Hardcoded Spells.2da lines

NWN:EE has unhardcoded "class spell columns" but the Innate column is used consistently as a fallback if none exist and for the Talent system by the game so make sure it is filled in.

Line 506, "HealingKit", is used to fire the OnSpellCastAt event when using SKILL_HEAL on a target. Don't reuse this line.

Spells.2da Columns

The spells.2da file has all the non-script information for setting up a spell, casting animations and so forth.

There are a handful of unused columns and almost all of them are not needed for a functional "spell".

Columns shaded in RED on the table below will be implemented in Patch 35.

Note: This is one of the only 2da files you can add additional valid columns - specifically columns that are like "Bard, "Cleric" which list the spell level of the entry for spell books, referenced in classes.2da in NWN:EE.

Column NameTypeExample ContentsValid OptionsNotes and Usage
LabelTextAcid_FogN/ANot used by the game as such, a human-readable name
NameTLK entry750TLK entryCan be an entry in dialog.TLK or a custom TLK, shows up in game as the spell title, and in feedback messages such as when casting unless overridden by AltMessage column. Feats being "cast" should use feat.2da names instead.
IconResRefIcon texture resrefis_AcidFog
Icon name, minus the .tga extension

A, C, D, E V, I, N, T

(technically spellschool.2da values, but really just hardcoded)

G is unused would need testing. Even monster abilities have this set (usually just to Evocation, V)

To test: Having additional spell schools or this as invalid (most likely "Bad Things(TM)" will happen)


P - Personal - 0M (but seems to default to 2.25 if it is targeting another object, eg; a scroll on the ground to enchant)

T - Touch - 2.25M

S - 8M

M - 20M

L - 40M

The values are hardcoded, although the ranges.2da entries (ie the range values themelves) are not. Tested further values (like "A") and it defaults to 0.0 range since it's undefined.

Note that the ranges are not centre point to centre point, but "creature edge to creature edge" based on PERSPACE (or CPERSPACE) in appearance.2da.


V - Verbal

S - Somatic

VS - Verbal and Somatic

**** - Neither

Verbal or Somatic components needed. Verbal needs the caster to be able to speak (Eg; not silenced, deafened imposes 20% failure check). Somatic requires them to be able to use their arms (eg; not being Paralyzed) and is affected by armour failure chance.
MetaMagicBitwise Hex Integer


None = 0x00

Empower (1) = 0x01

Extend (2) = 0x02

Maximize (4) = 0x04

Quicken (8) = 0x08

Silent (16) = 0x10

Still (32) = 0x20

(see also Notes and Usage)

Some of this happens entirely in engine (Still Spell, Silent Spell and Quicken Spell).

The remaining (Empower Spell, Maximize Spell, Extend Spell) are captured in the spell script

To calculate the cost of multiple allowed Meta Magic feats, add the decimal values together. For example:

  • 0x38 = Quicken+Still+Silent
  • 0x3F = All metamagics

Additional metamagic cannot be added to metamagic.2da, it's all hardcoded.

A community-made hex calculator utility is available for download from the Vault.

TargetTypeBitwise Hex Integer


self (1) = 0x01

creature (2) = 0x02

area (4) = 0x04

items (8) = 0x08

door (16) = 0x10

placeable (32) = 0x20

trigger (64) = 0x40

(see also Notes and Usage)

This primarily affects players - monsters seem to be able to ignore it, causing some "interesting" issues.

Some standard spells also are problematically miscoded, eg; having a Self Only target type, but a range higher than Personal.

To target more than one type, add the decimal values together.

If the spell has a master spell, or if the spell is the master of other spells, only the value on the master spell will be taken and used, and all sub-spells will use that value, regardless of their own value.

Note: ALL spells should include the decimal value for Items (8) - 0x08 - in their calculated value or else Item Crafting will not work (ie they cannot be cast on scrolls).

A community-made hex calculator utility is available for download from the Vault.

ImpactScriptScript resrefnw_s0_light

Script name minus the .nss extension that fires on the impact. Will only fire when successfully cast - ie; not interrupted by a concentration failure.

Note, Bioware naming convention reserves S0 for spell scripts, S2 for feat abilities, and S3 for creature abilities.










**** denotes the spell is unusable by that class.

0 through 10.

10 is used only for Epic Spells, there are no level 10 spell slots in the game.

The only one that is required is Innate. The defaults are 0 (cantrips) through 10 (Epic spells). However the 10 value won't show up in usual spell books so would only affect item-cast, cheat-cast or feat-cast things. 10 is likely the usual maximum for the game anyway, due to how "talents" work (CR for talent functions is double spell level).

You should always at least put an innate spell level even if it is a feat-spell. Blanking it out is not recommended, it can highly mess up a variety of in-engine things otherwise (and yes Bioware forgot it on some abilities making them bug out in certain circumstances, mainly related to Dispel Magic, GetSpellSaveDC and Spell Resistance).

You can add more columns (anywhere in the 2da, but usually at the end) to add more spellbooks. For instance you could create one headed "Assassin" and have Assassin spells, with the relevant changes in classes.2da allowing that spellbook to be used.

Note: The spell lines for Dispel Magic spells are hardcoded into the engine assuming certain spell levels (the "Innate" column) for such things like Counterspelling.

ConjTimeInteger (miliseconds)1500

Usually 1500 or 900 for normal spells

Mostly 0 or 1 or 500 for abilities although Dragons Breath uses 2000

The amount of time spent "Conjuring" the spell in milliseconds, applying the "Conj" animations, sounds, and VFX. Once this number is passed the CastTime and Proj fires if appropriate.

For spells this is the duration that can cause concentration checks. The default is 1500 but 900 is used for spells like Phantasmal Killer which has a slow "projectile".

Monster abilities vary (and don't matter as much - no concentration!) eg; gazes, bolts are 500, auras are 1, cones are 100 or 500. Dragon breath is 2000.

Using values above 2000 may cause issues from past experience. Going over 6 seconds total, 6000, certainly can cause issues since it overlaps the next round.

Haste and Quicken affect this number in different ways:

  • Haste will half the value (so usually 750)
  • Quicken will set to 500 at most, or this number if less than 500.

Both have a special 3000 round timer set thus this helps the animations to keep within the 3000 timer.

ConjAnimSet valueshand



See: Animations

Hands usually are spinning hands around, head means spinning hands over the head. This is where the "Hand" visual will be attached as well.

If ConjTime is blank or 0 this effectively shouldn't be used.

If an item is used the "ConjAnim" is effectively replaced as per Animations for each item type, such as reading a scroll animation for a scroll item.

Annoyingly there is no way to set any custom animations using this column.

ConjHeadVisualModel resrefvco_mehedelec01
Head based conjuring visual effect (attached to the head node). Resref of visual effect model. "vco" = "visual conjure"
ConjHandVisualModel resrefvco_smhanfire01
Hand based conjuring visual effect (attached to the hand node). Resref of visual effect model. "ConjAnim" alters where hands are by default.
ConjGrndVisualModel resrefvco_lgrinevil01

Ground based conjuring visual effect (at the casters feet). Resref of visual effect model.

Higher level spells tend to have this to differentiate them from lower level versions.

ConjSoundVFXSound resrefsco_mehannatr01
Sound used when conjuring. This is useful to always have because non-PC races don't get casting chants (next two lines).
ConjSoundMaleSound resrefvs_chant_ench_lm

Sound used if the caster is Male (or rather not-Female) and a base race. Bioware included variants for "high" and "low" magic, of each spell school.

vs_chant_XXXX_YZ - XXXX = 4 letters of school, Y = "l" (low) or "h" (high) and Z = "m" (male) or "f" (female)

If not a player race - values 0 - 6 in racialtypes.2da - it seems to ignore playing this entirely.

ConjSoundFemaleSound resrefvs_chant_ench_lf

Sound used if the caster is Female and a base race. As above variants are included for high/low magic and each school.

If not a player race - values 0 - 6 in racialtypes.2da - it seems to ignore playing this entirely.

CastAnimSet valuesarea

See also for pictures/info: Animations

area - Hands are placed up and apart. EG: Acid Fog.

attack - Attack animation is used. Used for Arcane Archer feat-spells.

out - Hands are placed together and forwards, for cones. EG: Burning Hands

self - Hands together, touching chest. EG: Ghostly Visage.

touch - One hand is placed out and one to the side. EG: Aid. Also "point" is valid for this.

up - Hands are placed up and together. EG: Call Lightning

creature - A special animation used only for Mind Flayers - "Suck Brain" - so probably unavailable for other creatures.

Animation to use for the casting (once conjuration animation is complete). Most are obvious, and fit for instance "out" being a cone spell (Holding hands where the cone will appear). If the creature casting the spell has limited animations this may not be fully adhered to.

Annoyingly there is no way to set any custom animations using this column.

CastTimeInteger (milliseconds)1000Usually 1000, but 1700 for cones

Milliseconds holding the CastAnim pose. Most are 1000 (1 second).

Cones benefit from more "hold out hands" time to match the spell visuals, although 1700 pushes these spells over a 3 second cast time which is odd.

CastHeadVisualModel resrefvca_dragbreath
Head based casting visual effect (attached to the head node). Resref of visual effect model. Occurs in the direction of casting. Example: Dragon Disciples Breath. "vca" = "visual cast"
CastHandVisualModel resrefvar_conefire
Hand based casting visual effect (attached to the hand node). Resref of visual effect model. Occurs in the direction of casting. Example: Cone spells. "var" = "visual area"
CastGrndVisualModel resref

Ground based casting visual effect (at the casters feet?). Resref of the visual effect mode. No default Bioware spells use this.
CastSoundSound resrefsar_conefire
Sound used when casting. This is mainly used to have the visual such as a cone match with an appropriate sound.

0 - No projectile

1 - Has projectile

Does this have a projectile? activates the next 5 columns. It fires a single projectile model towards the target location (if ground) or object (if a object is selected), or if it is a wider VFX like the various cones or breath attacks it fires them in the direction at the chosen point or person.

A projectile will fire a VFX and will affect when the ImpactScript is run if HasProjectile is used in tandem with this. See below for that entry. This means a fireball for instance has to travel to the target location then it explodes.

If HasProjectile is 0 then the script fires right away, used for Cone of Cold or Dragon Breath attacks, where the VFX mainly is replacing a EffectVisualEffect call.

Note progfx.2da can now mimic some of these as MIRV style objects with EffectVisualEffect and their projectile options.

ProjModelModel resrefvpr_ectoacid01

Projectile visual effect (See ProjSpwnPoint for where it appears) "vpr" = visual projectile.

ProjTypeSet valueshoming

homing - Example: Fireball. Straight line and homes in on a target even if moving, reasonably slow projectile.

ballistic - An arced object, again homing so will always hit. Giants Hurl Rock when polymorphed as a Giant uses this (and a lot of special cutscene/ballista style things)

highballistic - Not used by any spell by default, presumably an even higher arc.

burst - Not used by any spell by default. Needs testing. MIRVS use "BURST_UP" so similar perhaps.

accelerating - Example: Dispel Magic. Goes to the point in a straight line and homes in on the target, but accelerates so quite fast.

spiral - Example: Hellball. Does a weird spiral around the target until it hits, takes a reasonably long time even if the target stands perfectly still

linked - While some with Proj set to 0 (Lightning Bolt) probably are nonfunctional, the Trap_Arrow and others are set to this, and send a projectile (ie an arrow).

bounce - Example: Grenades. Bounces a projectile object a few times on the ground before hitting the target location/object

The projectile type. Also note this can be altered using the parameter "nProjectilePathType" in ActionCastSpell functions, although several are missing from the parameter.

Note that progfx.2da can now mimic these - although possibly not perfectly (although there are more options - like miss options) - with the options including all of these as integer values instead of names.

ProjSpwnPointSet valueshand













root - see notes.

Spawn point on the caster that the projectile leaves from. Values are: hand (used for 99% of spells), head and monster - monster9 (used for Beholder rays from eyestalks).

If the value is invalid it appears to use the "root" node (perhaps just use "root" in those cases)

ProjSoundSound resrefspr_ectoacid01
Sound of the projectile
ProjOrientationSet valuespath

path - projectile facing travel path

target - projectile faces target

Orientation of this spell's projectile while it is in flight. All standard spells use path (projectile faces the direction it is traveling), but target is another supported value (projectile faces the target).
This is entirely unused by the game and may just be a developer-left-in notes field or a pre-nwscript way of doing immunities
Unused by the game, item properties are controlled through the itemprops.2da, itempropdef.2da, iprp_costtable.2da and iprp_paramtable.2da - specifically IPRP_SPELLCOST in this case lists what direct spell immunities can be on items.






SubRadSpell6 (NWN:EE)

SubRadSpell7 (NWN:EE)

SubRadSpell8 (NWN:EE)

Integer spells.2da line reference
spells.2da line

The spells on a radial, such as when Polymorph has different options available.

NWN:EE added 3 more SubRadSpellX options; 6, 7 and 8. These are not present in the default spells.2da included in the game but can be added by hand (anywhere - but commonly in the middle with the others).

CategoryInteger spells.2da line reference

TALENT_CATEGORY_* constant number.

This is the category as checked by the Talent script system.

Note: categories.2da is unused by the game but has similar contents to the nwscript.nss constants - the dispel option however is unused by the default AI and isn't a nwscript.nss constant and isn't used by default so don't use it. Adding more to categories.2da functionally does nothing, but you might be able to use higher numbers if for some reason you ever wanted to use the talent system (hint: Don't bother!)

Is buggy if a spell level is not set in the Innate column. Frankly Talents are buggy overall so good luck if you want complex behaviour from them in any case.

MasterInteger spells.2da line reference

The master of this spell if it is a subradial spell. It should be left blank if it is not a subradial spell.

Note: This is buggy, and some spells have it set even if they're not a radial spell (copy and paste errors on Biowares part!). This causes GetHasSpell to perform incorrectly, but the game still works correctly otherwise - very frustrating!


1 = spells

2 = creature power

3 = feats

4 = item power

This both categorises them in the toolset and has several in-game effects on the use of abilities/casting of spells.

See Spells and Abilities for a more tabular approach.

1 is for general use spells, they can be assigned as special abilities with a caster level on a creature template even if no class can cast them. Needs the "Innate" column setting (which should typically always be set!). If a spell is set to 1 then these also apply:

  • ResistSpell properly works
  • Saving throw functions add the proper defensive feats, and SAVING_THROW_TYPE_SPELL bonuses/penalties. SAVING_THROW_TYPE_DEATH also respects immunity to Death spells.
  • Spell failure chance affects it (arcane and general)
  • The spell can be counterspelled
  • Spellcraft is needed to identify them when cast
  • Spell has concentration checks applied when incoming damage during the CastTime
  • Causes an AOO when used, which can be disabled when using Defensive Casting
  • Automatic Still, Automatic Quicken and will work with it (Automatic Silence works with anything)

2 is for Creature Powers. They appear in the toolset and can be assigned as Special Abilities. There is no caster level associated with them only uses/rest.

  • Oddly Saving throws also add SAVING_THROW_TYPE_SPELL against these, and act the same for Immunity: Death Magic.
  • ResistSpell fails and returns -1

3 is for Feats. These do not appear in the toolset, and should be linked to a feats.2da line.

  • ResistSpell cannot check spell level immunity, but does check spell resistance. Weird stuff.
  • GetCasterLevel() should return the class level of the creature using the ability (eg; a Blackguard using their FEAT_BULLS_STRENGTH should have their Blackguard levels only applied as the caster level). This bugs out for creatures using ActionUseFeat.
  • GetSpellSaveDC() should be

4 is for item powers or "not any of the above". Use it for hidden super cool cutscene spells, ballista shooting spells with high projectile arcs, and so forth. They don't intrinsically just appear on items - they need to be linked in the iprp_ 2da files. Note that some abilities are classified as this (eg; some shifter polymorph abilities) leading to some odd behaviour compared to their usual counterparts.

  • ResistSpell fails and returns -1
  • Does not apply SAVING_THROW_TYPE_SPELL

Note: Values higher than 4 are ignored.

SpellDescTLK entry113002
Can be an entry in dialog.TLK or a custom TLK, shows up in game

0 - No concentration

1 - Uses concentration

This stops concentration checks for this ability. Usually all monster abilities.

Note that it does not stop attacks of opportunity.

Some do have this set to 2 - not sure what this value means (Aura_of_Hellfire or Hell_Inferno for instance).


0 - No spontaneous casting

1 - Spontaneous casting allowed

If the caster has the "Can cast spontaneous spells" (usually only Clerics) this applies (usually only "Cure" and "Inflict Wounds" spells), and the spell is marked with a 1, then they can cast it and lose a different spell that is memorised of the same level.

Note: Domain spells memorised cannot be used to cast spontaneous spells.

AltMessageTLK entry53231

TLK reference to replace the "CREATURE casts SPELL NAME" text. This is recommended to use on non-spell abilities. EG: Bolts use 53231 which is:

<CUSTOM0> uses bolt attack.

<CUSTOM0> is the name of the spell caster (or "Someone" if you can't detect them), so the above would become "Lich uses bolt attack." in the feedback. You can't specify the Name field so you must code a single TLK line per different ability if you want them to be different.

If set then this will remove the need for identification of the spell and will just display this string.

Minor notes:

  • The default "casts" line appears to be TLK line 10482 (<CUSTOM0> <CUSTOM1> <CUSTOM2>) - CUSTOM0 is the same, but CUSTOM1 is "casts", "casting" or "uses" (might be an item) and CUSTOM2 is the spell, or "Unknown Spell" if spellcraft checks fail.
  • There are also alternatives, ie; interruption by counterspell, which is 10483 (<CUSTOM0> casts <CUSTOM1> : *spell countered by* : <CUSTOM2> casting <CUSTOM3>).

0 - Not hostile

1 - Hostile

Value 0 (false) or 1 (true). Determines whether a spell is considered hostile when being cast on other creatures.
FeatIDInteger feat.2da line reference
feat.2da line reference

Feat ID reference. Must be filled in for spells.2da lines attached to feats. There is a 1:1 mapping.

Note if you're doing something like the feat Wildshape which has subspells check this for how to do it with magic numbers: Subfeat Spells



Integer spells.2da line reference
spells.2da line reference

These are 2 columns that say "This spell specifically can be used to counterspell these:". It has nothing to do with anything else.

When in counterspell mode, rather than using Dispel Magic, if either of these are known by the counterspeller they instantly and always work.


0 - No projectile "moves to target"

1 - Has projectile that "moves to target"

If 1 then the spell has a projectile - the spell script will not fire until the projectile has reached its target if it is 1. Examples might include Fireball which fires a ball that travels in before blowing up.

If 0 it fires the spell script straight away - the Projectile VFX are still fired, eg: Breath Weapons have this column set to 1 even though the Proj column is set to 0. Seeting this column to 0 for a Breath Weapon disables the VFX.

TargetShapeString sphere






OR an integer for custom shapes

The Spell Targeting system was added in 87.8193.35 and allows players to see how big an AOE shape is before casting. You can add your own shapes and IDs and supply clients with shader files to support them.

This is purely clientside and has no effect on the game logic (and may be wrong if you alter spell scripts) as well not used by the server at all (although keeping it in sync with the client allows some nice metadata!).

You can override it per-player with SetSpellTargetingData() this is helpful to have, for instance, a bigger fireball area affected by a feat for that one player.

The default values translate into IDs used in nwscript and shaders - except default **** "none" (ie no shape shown, other columns ignored, although the distance to target point or object is still shown).

Below is what they are used for and map to nwscript/shadeer wise. For examples see the current spells.2da

  • sphere - A simple Sphere like for Fireball. SPELL_TARGETING_SHAPE_SPHERE = 1
  • rectangle - A rectangle. Angled against the casters angle. eg Lightning Bolt. SPELL_TARGETING_SHAPE_RECT = 2
  • cone - A Cone such as for Cone of Cold. SPELL_TARGETING_SHAPE_CONE = 3
  • hsphere - A "Hole sphere" or donut like for Meteor Swarm. SPELL_TARGETING_SHAPE_HSPHERE = 4

If you put in anything else it's treated as an integer, so for instance using a value called 5 allows a custom SPELL_TARGETING_SHAPE to be created and passed into the shader.

Only a value of **** is ignored. The other parameters have a variety of combos the default shaders use.


**** if unused else a positive float

sphere - radius of the sphere

cone - the length of the cone in the direction of lTarget. Spell cones are always 60 degrees with the origin

  • Note the very unused SHAPE_CONE isn't really supported (which can alter the degrees as well as the distance with the size) so just...don't use it, or code your own shader ID for it

rectangle - the X size of the rectangle (spell cylinders or cubes)

hsphere - the inner "safe" radius of the donut or "hole sphere"

TargetSizeYFloat10**** if unused else a positive float

sphere - unused

cone - unused

rectangle - the Y size of the rectangle (spell cylinders or cubes)

hsphere - the outer radius of the donut or "hole sphere"

TargetFlagsInteger nwscript.nss SPELL_TARGETING_* reference1

SPELL_TARGETING_FLAGS_* (in nwscript.nss).

0 - None

1 - Harms Enemies

2 - Harms Allies

4 - Helps Allies

8 - Ignores Self

16 - Origin on Self (used for cones/breath attacks and personal only spells)

32 - Suppress with Target (if target selected, no AOE marker shown)

The final value entered into this column is determine by adding the values of the targeting flags together.

It doesn't have to be set and defaults to 0 if so.

For example, Acid Fog is listed with a TargetFlags of "3" in spells.2da, meaning that it Harms Enemies and Harms Allies.

Note: "Suppress with Target" (32) means the spell's AoE targeting visual will be suppressed when hovering over a target. Useful for things like Dispel Magic and variants where you have a different effect when targeting one person (it dispels all spells on them) versus an area (dispels 1 spell per person). This is in comparison to Fireball which affects everything in the AOE equally even if a single target is selected.

This can also be a custom value if you code it into your shader file and you can alter the colours in the shader file too.

The AOE colour works on this basis in the default shader:

  • If it doesn't specifically do any special targeting, it is white (flags 1, 2 and 4 are not set).
  • If it harms enemies and allies (3) it is red
  • If it harms enemies and allies (3), but not self (8) it is orange
  • If it helps allies and doesn't harm allies (4 or 5) it is green
  • If none of the above, then it is blue (usually selective hostile, so affects enemies only, or affects enemies and allies differently)

Standard uses with the colour of the AOE marker given:

  • 0 or not set - No specific targeting. White outline.
  • 1 - Selective hostile - only ever affects enemies. EG: Issac's Missile Storm. Blue outline.
  • 3 - Standard hostile - affects allies and enemies. EG: Fireball. Red outline.
  • 4 - Helps allies only. EG: Bless. Green outline.
  • 5 - Helps allies and harms enemies. EG: Prayer. Blue outline.
  • 11 - Doesn't affect self, standard hostile so affects everyone but never self. EG: Implosion. Orange outline.
  • 17 - Origin on self, selective hostile - EG: Storm of Vengeance. Blue outline.
  • 19 - Origin on self, harms allies and enemies - EG: Cone of Cold. Red outline.
    • Note this is also suitable for spells like Meteor Swarm which uses TargetShape hsphere
  • 20 - Origin on self, helps allies - Blue outline.
  • 21 - Origin on self, helps allies and harms enemies - EG: Natures Balance. Green outline.
  • 27 - Origin on self, ignores self, harms allies and enemies - EG: Earthquake. Orange outline.
  • 35 - Suppress with target, harms allies and enemies - EG: Dispel Magic. Red outline.
  • No labels