Information on 2da files, which are essentially 2 dimensional array tables of information. See the left hand bar for a list of information on specific 2da files.
Note a lot of information on specific 2da files are on different pages, such as Spells and Abilities for spells.2da.
2da Format
The 2da format is relatively simple, and can be read about in the Bioware documentation. It looks like this:
2DA V2.0 Column1 Column2 Column3 0 Entry1 "Entry2" ****
- The top line must be 2DA V2.0
- You can optionally include a "DEFAULT:" definition for the string that will be returned if there is no data to otherwise return. **** returns a blank string still, but if you request via. Get2DAString() an invalid row or an invalid column entry it will return the DEFAULT: value. No Bioware 2da does this (and likely shouldn't) but may be useful for custom 2da files.
- There may be one or more blank lines before the first line that contains characters, which is considered the header line
- The first column header must be blank, and that column is ignored (is usually a human readable number)
- The first column number IDs can be wrong - the game just reads each new line as a new entry (incremented from 0)
- The second and onwards columns must have the header match the in-game reference loaded, the order of columns doesn't matter. Label columns are generally ignored.
- The first column header must be blank, and that column is ignored (is usually a human readable number)
- Further lines are data rows:
- Column data - but not the header name - can be in double quotes - "text here" - to include spaces. The maximum amount of text in quotes can be 256 characters. Whether or not the game understands that one being in quotes very much depends - see individual 2da notes.
- Column data is separated by one or more whitespace characters (tabs, spaces)
- Blank data is classified with 4 stars: ****
- You can quote the stars ("****") or have a blank quoted field which, of course, is blank ("") but any other combination of stars (less, more, or in single quotes) will be returns literally.
- Entire blank rows are skipped and not counted as data rows. You must define some characters for it to be a data row.
This all comes together to mean some very odd looking 2das can be completely valid.
You can find notes on reading 2DA files in scripts at the Lexicon page for Get2DAString. Main thing to note is on error (no column or row matching etc.) and on blank entries it returns an empty string.
Missing Columns versus Blank Columns (****)
There is different behaviour for certain columns where the column is missing entirely (eg; using a old 1.69 version of a 2da) versus the column being present but blanked (****). A notable example is the additional columns in racialtypes.2da which defaults to the 1.69 implementations if the columns are not present to maintain compatibility, and where **** can actually be counted as "Empty value" instead of "Missing value" meaning different behaviour.
Order of Columns
The game generally won't care what order columns are in except for some minor exceptions;
- swearfilter.2da cannot be rearranged
- The first column of the spell preference 2da files
- itemprops.2da appears to be hardcoded due to the PropColumn in baseitems.2da (although not sure if you can add more columns to it).
It is recommended not to reorder columns on any game 2DA just in case.
Adding Columns
Most game read 2da files (if not all) can have custom columns added but these are only useful for Get2DAString (and it's a much better idea to create a custom 2DA file for additional metadata to not hit NWSync 15MB file size limits).
In one instance in NWN:EE this has a valid use case the engine recognises: Additional "Spellbook" columns in spells.2da, which are now referenced by column name in classes.2da.
Referencing Columns
When a column for a 2da references another 2da, and the entry requires an ID to use from the other 2da (eg feats.2da having a column to link to a line in spells.2da), the ID you must give it is actually the line number offset from base (base being where index 0 starts). This basically just means 2da line ID numbers cannot be skipped, but is mostly only relevant where a persistent server has heavily modified 2da's.
2DA List
This is a list of the different core 2da files (we're ignoring tileset specific ones but there will be a generic entry for them, plus the multitude of class and package 2das) with a note about the usage for client or server, and line limits (if known). Anything in this list is used by the game, the unused ones are listed later on this page.
Note: If a 2da file is listed as "Server Loaded: No" it would still be recommended to include it in relevant hakpack files if altered since Get2DAString will break, and the size of the files is very tiny in any case.
There are a limit to the amount of lines the engine will properly use for 2da files. This is either restricted due to:
- Engine limits - the game handles the data around the engine in certain sizes, eg uint8_t, or int32_t and may truncate, lose or wrap around data if the 2da goes too big, or just ignore additional rows.
- Note: nwscript has an inherent limit of int32_t so 2147483647 even if the engine could technically go beyond this number therefore we use 2147483647 (int32) as our functional maximum regardless of what the game reads (uint32, int32, uint64 or int64). Note having 2 billion rows is going to not go well if you ever try it so this should be considered functionally unlimited.
- GFF storage chosen - eg WORD vs DWORD vs BYTE vs CHAR etc. for save games, loading data from blueprints, areas, BICs etc. so becomes a practical hard limit since it's a mess to workaround usually.
- Network traffic limitations - even in SP there is a "server" running. Since the game was made for dialup so Bioware coded in a lot of practical limits to lower packet sizes, which causes some odd limits sometimes such as 128 or 65535 or 63 etc.
| 2da file | Brief Description | Client Loaded | Server Loaded | Toolset Loaded | Functional Line Limit | Line Limit Notes |
|---|---|---|---|---|---|---|
| actions.2da | List of actions and associated icons / TLK strings used by the GUI | Yes | Yes | No | Hardcoded | This file cannot have alterations to lines made, the references are all hardcoded. |
| ambientmusic.2da | Ambient music tracks | Yes | No | Yes | 2147483647 (int32) | GFF field is stored as INT (-2147483648 to 2147483647). |
| ambientsound.2da | Ambient sound tracks | Yes | No | Yes | 2147483647 (int32) | GFF field is stored as INT (-2147483648 to 2147483647). |
| ammunitiontypes.2da | For the hardcoded ranged weapons, what models to use for certain ammo types (eg; Fire Arrows) | Yes | Yes | No | 2147483647 (int32) | Can be now updated with more damage types (eg Holy arrows) but no new base ammo types. The server loads it but won't use the data as such. |
| appearance.2da | Creature appearances and base properties like size etc. | Yes | Yes | Yes | 0 to 65535 (uint16) | GFF field is stored as WORD (0 to 65535) and the engine enforces this limit as well, in network and server and client. |
| appearancesndset.2da | Appearance Sound Set eg what ambient sound they play, referenced by SOUNDAPPTYPE in appearance.2da | Yes | No | Yes? | 2147483647 (int32) | Only referenced by other 2da files not saved to GFF or sent over network. |
| armor.2da | List of armor values, although some of this is hardcoded. | Yes | Yes | Yes | 2147483647 (int32) | The game stores base armor classes in int32 which is fascinating. New AC values can be added but only incrementally (so higher AC, eg: 8, 9, 10 could be added next) and all need Heavy Armor feat. |
| baseitems.2da | All the item types in the game (eg: longsword, torch, scroll) | Yes | Yes | Yes | 2147483647 (int32) | Before patch 36 was limited to 0 - 255 due to network messages. Now uncapped correctly. |
| bodybag.2da | The bodybag a creature will leave around. | No | Yes | Yes | 0 - 255 (uint8) | GFF field is stored as BYTE (0 to 255). |
| cachedmodels.2da | Lists all models that will always be kept loaded in memory when a module is loaded. Use with care. Added in 1.88.8193.36 | Yes | No | No | 2147483647 (int32) | Limit based on 2da line limits. |
| capart.2da | Creature Armor Parts, listing the model names of various bits inside a model for the client to load it properly. This is very unlikely to ever need changing however. | Yes | No | Yes | Hardcoded | Amount of armor nodes are hardcoded. |
| chargenclothes.2da | Clothing available at character generation. Important: This also needs the relevant UTI files (Item Blueprints) client side for the client to load custom clothing. The server picks up on what was chosen and generates it. | Yes | Yes | No | 2147483647 (int32) | No GFF field, is purely loaded by the engine (at chargen client side and on the server side when the client sends over what clothing choice at the end of chargen for that item to load). |
| classes.2da | Character classes and main class options. See subpage for further details. Clients need all these parts since clients actually do all their character changes client side and send it to the server to just validate it. | Yes | Yes | Yes | 0 - 254 | Hardcoded due to network limitations plus note "255" number is reserved as "CLASS_TYPE_INVALID" so not usable. |
| cloakmodel.2da | Cloaks model references and options for each model. The server uses this as well as the client to check for validity with script commands changing them. | Yes | Yes | Yes | 0 to 65535 (uint16) | 34 and earlier was 0-255, extended in patch 35. |
| cls_atk_xxx.2da | Standard name for classes.2da "AttackBonusTable" 2da value, defining the Base Attack Bonus progression | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. In any case epic levels (21+) have static progression from epicattacks.2da making it redundant to use this. |
| cls_bfeat_xxx.2da | Standard name for classes.2da "BonusFeatsTable" 2da value, defining the bonus feats a class gets | Yes | Yes | Yes | 0 to 65535 (uint16) | Engine limit when loading the 2da. Note number of bonus feats per level is capped at 255. |
| cls_feat_xxx.2da | Standard name for classes.2da "FeatsTable" 2da value, defining the feat availability for a class | Yes | Yes | Yes | 0 to 65535 (uint16) | Engine limit when loading the 2da. |
| cls_pres_xxx.2da | Standard name for classes.2da "PreReqTable" 2da value, defining the prerequisites for taking this (Prestige) class | Yes | Yes | Yes | 2147483647 (int32) | This is hardly going to ever be the longest file. I hope. |
| cls_savthr_xxx.2da | Standard name for classes.2da "SavingThrowTable" 2da value, defining the saving throw (Fortitude, Will, Reflex) progression | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. In any case epic levels (21+) have static progression from epicsaves.2da |
| cls_skill_xxx.2da | Standard name for classes.2da "SkillsTable" 2da value, defining the skills the class has available | Yes | Yes | Yes | 0 - 255 | Essentially you're capped by the skills.2da limit (see skills.2da), the game funnily enough uses uint16_t internally to keep this 2da loaded, so I guess you could have some blank lines and it still works fine. |
| cls_spgn_xxx.2da | Standard name for classes.2da "SpellGainTable" 2da value, defining the spells gained each level (How many can be cast per level). Every spellcaster needs this. | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. Note in EE that spellcasters are typically limited to level 40 in the engine. |
| cls_spkn_xxx.2da | Standard name for classes.2da "SpellKnownTable" 2da value, defining how many spells are known (Eg; for Bards and Sorcerers) | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. Note in EE that spellcasters are typically limited to level 40 in the engine. |
| cls_stat_xxx.2da | Standard name for classes.2da "StatGainTable" 2da value, defining the stat increases for the class (Eg; Dragon Disciple, Pale Master) | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. |
| creaturesize.2da | File is hardcoded (engine values in ruleset.2da) and only used by the toolset for the names of sizes | No | No | Yes | Hardcoded | Noted in description this is basically hardcoded and is for toolset only use. |
| creaturespeed.2da | File defining the speed of PCs and NPCs | Yes | Yes | Yes | 0 - 255 | This file can be extended (up to 255 since BYTE is used to store this in save games/on BICs, although the toolset uses DWORD in a silly way) Note some lines are hardcoded. See creaturespeed.2da |
| crtemplates.2da | This defines some "creature templates" for NPCs such as "Half-Celestial" used in the toolset only. Links to ini files that load items and stat changes onto the creature blueprint. | No | No | Yes | 2147483647 (int32) | Needs testing - but frankly who would ever use this seriously? Solely for Toolset usage. |
| cursors.2da | Not a complete list of cursors, but used for trigger objects to define some mouse over cursors. Most cursors in the game are hardcoded and for the scripting OnPlayerTarget event you can set your own unrelated to this 2da. | Yes | No | Yes | 0 - 255 (uint8) | GFF field is stored as BYTE (0 - 255) and usage in nwscript commands is limited to 0 - 255. |
| damagehitvisual.2da | Damage VFX line sent to the client when a particular damage is inflicted by a weapon. | No | Yes | No | 0 - 31 | Now (mostly) unhardcoded for new entries, but limited 0 - 31 with some table values being hardcoded. See: Creating Custom Damage Types / 1.87.8193.35 |
| damagetypegroups.2da | Groups of damage, used for feedback and GUI colour information. | Yes | Yes | Yes | 0 - 31 | Now (mostly) unhardcoded for new entries, but limited 0 - 31 with some table values being hardcoded. See: Creating Custom Damage Types / 1.87.8193.35 |
| damagetypes.2da | Damage types - unhardcoded as of patch 1.87.8193.35 - allowing for the fact some are hardcoded still such as the physical damage types. | Yes | Yes | Yes | 0 - 31 | Now (mostly) unhardcoded for new entries, but limited 0 - 31 with some table values being hardcoded. See: Creating Custom Damage Types / 1.87.8193.35 |
| damagelevels.2da | Damage levels, such as "Uninjured" or "Near Death". The amount of HP each level is for is hardcoded, this is purely for clientside TLK loading. | Yes | No | No | Hardcoded | The damage levels are set in the engine, this just displays the right localised TLK string. |
| defaultacsounds.2da | The sounds of each armor when hit, thus leather armour when hit by a sword has the impact effect sound like leather. Only is loaded if the ArmorType column of appearancesndset.2da is blank, and it looks up the chest AC value. | Yes | No | No | 2147483647 (int32) | Essentially a lookup from the AC value of the item. New AC values can be added but only incrementally (so higher AC, eg: 8, 9, 10 could be added next). |
| des_xxx.2da | These 2da files were used by Bioware designers to have custom systems that work with Get2DAString() in scripts, eg for crafting. | No | Yes | No | N/A | No limits as such apart from what limits 2DA files have naturally |
| diffsettings.2da | Difficulty Settings used by the game, at least the ones Bioware made editable. | Yes | Yes | No | Hardcoded | The amount of difficulty options and what options are editable is hardcoded. |
| disease.2da | Diseases defined by the game for EffectDisease or On Hit: Disease item properties. Clients are sent completed effects, not the information loaded in this file, except the name used On Hit item properties most likely. | Yes | Yes | Yes | 2147483647 (int32) | |
| domains.2da | Domains that by default only Clerics use, but now in EE any spellcaster can be assigned if setup. | Yes | Yes | No | 0 - 255 | Engine seems limited to 255. GFF field is stored as BYTE (0 - 255) |
| doortypes.2da | List of doors tied to various tilesets. Clients will load it for most likely the sound reference. SoundAppType references placeableobjsnds.2da. | Yes | Yes | Yes | 2147483647 (int32) | Engine saves with a DWORD and sends a full DWORD to the client and uint32_t/int32_t is used to look up 2da values. This is rather odd since creature appearances and placeables are not even sent with a DWORD - perhaps some optimisation due to there being just less doors sent. |
| effecticons.2da | Effect icons used by the game, now extendable massively in EE with EffectIcon. | Yes | Yes | No | 1 to 65535 (uint16) | For clients pre-1.89.8193.37 it will not send icons specified over line 255 (with NWNX you could send per-player effect icons to work around this). Line 0 is invalid. |
| encdifficulty.2da | Encounter difficulty. Used by servers for a multiplier on the "difficulty", and in toolset to set the difficulty. | No | Yes | Yes | 2147483647 (int32) | Should be able to add more. GFF field is stored as INT (-2147483648 to 2147483647) and toolset should load higher numbers, if you really need them. |
| encoding.2da | Encoding table. Not included in the game by default. | Yes | Yes | No | 0 - 255 | Set amount of ASCII encoding characters. |
| encumbrance.2da | Encumberance levels for amount of strength a creature has. Client uses this to show the amount you can carry. Server it is used where the speed is worked out. | Yes | Yes | No | 2147483647 (int32) Functionally: limit of ability score amounts (127, maybe higher with NWNX) | Rows go up to 100 but could be extended. Functionally limited by ability scores however. |
environment.2da | Contains the area lighting environmental presets available in the toolset only. | No | No | Yes | 2147483647 (int32) | Should be able to load more values, uses int in the toolset. |
| epicattacks.2da | Attack progression for epic levels (21+). Clients and toolset is just for showing numbers, server uses it. Line 0 is Level 21, 1 is 22 etc. | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. |
| epicsaves.2da | Save progression for epic levels (21+). Clients and toolset is just for showing numbers. Line 0 is Level 21, 1 is 22 etc. | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. |
| excitedduration.2da | "Excited" duration, ie; combat music time! Both options are the same, clients say it loads but is it used for anything? Probably not. It is also probably not worth altering this since...who knows what might happen in the engine. If you know maybe post it here! | Yes but not used? | Yes | No | Hardcoded | The entries here are hardcoded. |
| exptable.2da | Used to figure out when the characters levelup. | No | Yes | No | 41 | Line 41 is actually making level 40 the highest. EE has some bugs if you go over 40 levels for PCs around spellcasting. |
| feat.2da | Feats available for creatures to take, or are granted to them. | Yes | Yes | Yes | 0 - 65535 | uint16 used in network and in the engine, it should be fine to use up to 65535 since Subfeat Spells use values above this to identify them. However this needs fully testing with some potentially clashing ID's to be 100% sure. |
| footstepsounds.2da | Sound files loaded for particular footsteps depending on appearance. | Yes | No | No | 2147483647 (int32) | Engine seems to load everything as int32/INT on the GFF and send it as INT over the internet (while the server doesn't load the 2da, it does load which footstep sounds each creature uses and you can override it with a script command). |
| fractionalcr.2da | Sorts fractional CR for purposes of encounter challenge rating (working out what monsters to spawn). | No | Yes | No | Hardcoded | The amount of lines are hardcoded, although perhaps you can alter bits of it, it may break something. |
| gender.2da | Essentially a list of genders for the toolset, and on clients which TLK string to load for them. Server just uses a coded list (ie like the GENDER_* constants in nwscript) although it might use it via. Get2DAString if needed. | Yes | No | Yes | Hardcoded | Even if you can add more genders you'd need NWNX to have the server end work with them properly. |
| genericdoors.2da | The generic "general" doors and their modes/info. | No | Yes | Yes | 2147483647 (int32) | Appears to store it in DWORD on the GFF, and sent in then etwork as in INT and stored as uint32_t, so lots of usable lines. |
| hen_companion.2da | Animal Companions list. Used for clients to show at levelup, and servers to load the right resref. Toolset doesn't load it since NPCs have these settings wiped. | Yes | Yes | No | 2147483647 (int32) | Written to GFF as INT and used in game as such |
| hen_familiar.2da | Familiar list. Used for clients to show at levelup, and servers to load the right resref. Toolset doesn't load it since NPCs have these settings wiped. | Yes | Yes | No | 2147483647 (int32) | Written to GFF as INT and used in game as such |
| inventorysnds.2da | The sounds when inventory items are moved around the inventory or picked up (column "InvSoundType" in baseitems.2da). Server just sends the column ID number to the client to find the file to play. | Yes | No | No | 0 - 255 | Loads up to uint8_t rows of sounds, and the 2da only loads the reference as uint8_t so 0 - 255. |
| iprp_abilities.2da | Item Property - ability list. For each IPRP file it's assumed server needs it for item property generation/properties or Get2DAString for crafting. The client will need it for item examining so the right property info is loaded. | Yes | Yes | Yes | Hardcoded | Number of abilities are hardcoded in the engine. |
| iprp_acmodtype.2da | Item Property - AC modification type. | Yes | Yes | Yes | Hardcoded | 5 hardcoded AC types. |
| iprp_addcost.2da | Item Property Cost Table - "Additional" | Yes | Yes | Yes | 0 - 65535 | Additional Cost table things like Cursed identifiers can be added here. Cost table so uint16_t |
| iprp_additional.2da | Item Property - "Additional" | Yes | Yes | Yes | 0 - 65535 | Additional Cost table things like Cursed identifiers can be added here. Cost table so uint16_t |
| iprp_aligngrp.2da | Item Property Alignment Groups | Yes | Yes | Yes | Hardcoded | Amount of alignments is hardcoded. |
| iprp_alignment.2da | Item Property Alignments | Yes | Yes | Yes | Hardcoded | Amount of alignments is hardcoded. |
| iprp_ammocost.2da | Unlimited Ammo options. Resref of the "unlimited ammo" to equip depending on if arrow, bolt or bullet. | Yes | Yes | Yes | 0 - 65535 | Cost table so uint16_t |
| iprp_ammotype.2da | Unlimited Ammo "Ammunition type". Since it's tied to the weapon this is probably only used by the toolset, since the iprp_ammocost.2da determines the TLK string of the actual type (Eg; "Unlimited Fire 1d6") | Yes | Yes | Yes | Hardcoded | As with ranged weapons, ammo is hardcoded to 3 types. |
| iprp_amount.2da | Itme Property "Amount". Is simply 1, 2, 3, 4, 5 with TLK strings "Amount: 1", etc. attached. It used for things like Monster On Hit: Ability Drain [Drains Strength] [Amount: 3] | Yes | Yes | Yes | 0 - 255 | Parameter table so uint8_t |
| iprp_arcspell.2da | Item Property Arcane Spell Failure amounts. | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added (eg: -1, -2). Cost table so uint16_t |
| iprp_base1.2da | This is an intentionally blank cost table file referenced as line 0 in iprp_costtable.2da. It is used for any property which has no cost table value for it. How does it work out the cost? well the subtype 2da tends to have a Cost column. Very confusing I know. | Yes | Yes | Yes | Leave alone | Leave it alone blank, it might break things if edited since it's note expected to have anything in it. |
| iprp_bonuscost.2da | Item Property Bonus Cost. Used for ability score increases. | Yes | Yes | Yes | 0 - 65535 but note some values may overflow. | Cost table so uint16_t - however ability scores may overflow/cap if going too high. |
| iprp_chargecost.2da | Item Property Charges / Use or Uses / Day options. | Yes | Yes | Yes | Hardcoded | The amount of these is hardcoded since there is no options in this 2da for what each one is defined as. So no 10 Charges / Use can be added. |
| iprp_color.2da | Item Property Light Color choice. | Yes | Yes | Yes | Hardcoded | The lights relate to particular VFX lines, thus this list is hardcoded (but changing the TLK values and assinging different VFX models/progfx info may work). |
| iprp_combatdam.2da | Item Property Extra Melee Damage type of damage | Yes | Yes | Yes | Hardcoded | Only can have the 3 main physical damage types for this item property. |
| iprp_costtable.2da | Cost Table. This defines what 2da is loaded for each CostTableResRef ID number in itempropdef.2da You can add new item properties (which are just for the item description or to add/remove cost, and have scripted effects) by adding more rows to this. | Yes | Yes | Yes | 0 - 255 | Cost Table index is used in the engine as uint8_t Individual Cost Table values are uint16_t (0 - 65535) for custom 2das, most of the standard ones have other limits. |
| iprp_damagecost.2da | Item Property Damage Bonus and EffectDamageShield / some other things that need static and variable bonuses like 1d6 and 2d8. | Yes | Yes | Yes | 127 (or possibly 128) (char used in network packets) | Certainly going to line 129 or higher works for the server end (damage is done correctly) but the client won't show it correctly in the character sheet because it looks up 2da line as a negative (impossible). Line 159 was tested which had the string "-97 Magical Damage" since 159 - 128 = 31, and 128 - 31 = 97. It shows correctly on items, and higher lines are safe for NPCs to use. |
| iprp_damagetype.2da | Item Property Damage Bonus type of damage to apply. Interestingly has "subdual" and "physical" as options, perhaps hinting at an earlier damage system more aligned to D&D rules. Now (mostly) unhardcoded. See: Creating Custom Damage Types / 1.87.8193.35 | Yes | Yes | Yes | 32 / depends on damagetypes.2da | Now (mostly) unhardcoded but limited still to 32 entries. See: Creating Custom Damage Types / 1.87.8193.35 |
| iprp_damvulcost.2da | Item Property Damage Vulnerability cost table, eg 50% fire vulnerability. | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added. Cost table so uint16_t |
| iprp_feats.2da | Item Property Bonus Feat list. Keeps the amount in the toolset managable but you can extend this to be almost any feat.2da entry (some however will not function). | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added for custom feats. Subtype table means uint16_t |
| iprp_immuncost.2da | Item Property Damage Immunity cost table | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added (eg: 15, 20, 30). Cost table so uint16_t |
| iprp_immunity.2da | Item Property Immunity: Misc table, eg: Immunity: Death Magic | Yes | Yes | Yes | Hardcoded | This seems a static hardcoded list, engine defined, which has no correlation to the script constants, sadly much smaller too. |
| iprp_lightcost.2da | Item Property Light cost table (Brightness) | Yes | Yes | Yes | Hardcoded | Specific visualeffects.2da lines are loaded with a combination of this and iprp_color.2da. Sadly these are hardcoded although the VFX lines could be altered. |
| iprp_matcost.2da | Item Property Material cost table (ignore iprp_material.2da it isn't used only this one is). | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added. This property doesn't do anything in the engine and can be altered fine. Cost table so uint16_t |
| iprp_meleecost.2da | Item Property cost table for a variety of basic +1, +2 etc properties - AC, Attack, Enchantment, Regeneration, etc. | Yes | Yes | Yes | 0 - 65535 but more reasonably 127 or 255 or something. | Additional rows can be added. Cost table so uint16_t but there may be limits here due to the attack bonus cap for instance. |
| iprp_monstcost.2da | Item Property Monster Damage cost table. Note the hardcoded nature of the additional columns. | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added. Cost table so uint16_t |
| iprp_monsterhit.2da | Item Property Monster: On Hit table. It is hardcoded so should probably not be altered. | Yes | Yes | Yes | Hardcoded | These references are hardcoded, even if the 2da is used to load the correct parameter tables. |
| iprp_neg10cost.2da | Used for Item Properties; Ability Score Reduction and Skill Penalty. | Yes | Yes | Yes | 0 - 65535 but more reasonably 127 or 255 or something. | Additional rows can be added. Cost table so uint16_t but there may be limits here due to the skill bonus cap for instance. |
| iprp_neg5cost.2da | Used for Item Properties; Enchantment Penalty (attack and damage), Damage Penalty, Decreased AC, Reduced Saving Throws, Attack Penalty | Yes | Yes | Yes | 0 - 65535 but more reasonably 127 or 255 or something. | Additional rows can be added. Cost table so uint16_t but there may be limits here due to the skill bonus cap for instance. |
| iprp_onhit.2da | Item Property On Hit table, defines all the hardcoded engine On Hit properties and the param1 values (eg; what ability to drain, the duration/change to occur, etc.). The cost table determines the DC. | Yes | Yes | Yes | Hardcoded | This list is hardcoded to engine values. However the sub properties (DC, chance/duration) can be altered for particular ones as noted. |
| iprp_onhitcost.2da | Item Property On Hit cost table (the DC of the On Hit saving throw) | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added. Cost table so uint16_t |
| iprp_onhitdur.2da | Item Property On Hit parameter table used for durations/chance to happen. Used only for some On Hit properties, it defines things like 5% chance / Duration 5 rounds. | Yes | Yes | Yes | 0 - 255 | Parameter table so uint8_t |
| iprp_onhitspell.2da | Item Property On Hit Cast Spell table. Add more spells to use in this property here. | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added. Cost table so uint16_t |
| iprp_paramtable.2da | Item Property Parameter Table table. In itempropdef.2da the column Param1ResRef refers to this table. | Yes | Yes | Yes | 0 - 255 | Parameter Table index is used in the engine as uint8_t Individual Parameter values are uint8_t (0 - 255). |
| iprp_poison.2da | Item Property On Hit: Posion. It simply lists the poison ability damage. Otherwise hardcoded. | Yes | Yes | Yes | Hardcoded | The 6 ability scores are all you're going to get. |
| iprp_protection.2da | Item Property Damage Reduction, amount of enchantment needed to penetrate it (eg; +2 would need a +2 weapon to bypass). | Yes | Yes | Yes | 0 - 65535 | This is likely hardcoded due to other aspects of the game assuming a +0 to +20 range for DR and enchanted weapon properties. However it might be extendable, but would need a lot of testing. If it's extendable it's subtype so uint16_t max. |
| iprp_qualcost.2da | Item Property Quality cost table | Yes | Yes | Yes | 0 - 65535 | This is a customisable item property which has no ties to the engine so could be extended fine. Cost table so uint16_t |
| iprp_quality.2da | Item Property Quality table | Yes | Yes | Yes | 0 - 65535 | This is a customisable item property which has no ties to the engine so could be extended fine. Cost table so uint16_t |
| iprp_redcost.2da | Item Property Reduced Container Weight cost table (eg: -20%, -40%) | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added. Cost table so uint16_t |
| iprp_resistcost.2da | Item Property Damage Resistance cost table (Eg: 20/-, 30/-) | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added (eg: 1, 2). Cost table so uint16_t |
| iprp_saveelement.2da | Item Property: Improved/Decreased Saving Throws. Note there are the entries for Traps, Spells, Law, Chaos, Good and Evil but without valid TLK entries which means they cannot be selected. Adding TLK entries to them allows them to be picked. Now new ones can be added with savingthrowtypes.2da. | Yes | Yes | Yes | 0 - 65535 (but functionally limited to size of savingthrowtypes.2da) | The list no longer is hardcoded but still includes dummies of things that are not usual saving throw types like Backstab and Illusion. |
| iprp_savingthrow.2da | Item Property: Improve Saving Throw Specific and Reduce Saving Throw Specific. | Yes | Yes | Yes | Hardcoded | Hardcoded; has "All" plus the 3 base throws Fortitude, Will and Reflex. |
| iprp_skillcost.2da | Item Property: Skill Bonus cost table | Yes | Yes | Yes | 0 - 65535 | More values can likely be added needs testing to what extent and what value breaks skills in general (if you remove the cap on bonuses). Cost table so uint16_t |
| iprp_soakcost.2da | Item Property: Damage Reduction, the soak value cost table (eg; the 30 in Damage Reduction +15 / Soak 30) | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added (eg: 1, 2). Cost table so uint16_t |
| iprp_spellcost.2da | Immunity: Specific Spell cost table. Yes you have to add your new spells to this list to have specific immunities on item properties. | Yes | Yes | Yes | 0 - 65535 | Cost table so uint16_t |
| iprp_spellcstr.2da | On Hit: Cast Spell caster level of the spell cast, eg: On Hit: Call Lightning [Level 10] Really wish this method was used for the Cast Spell property for variable spell levels there! Alas... | Yes | Yes | Yes | 0 - 40 likely | Level 40 caster level is usually the max, might be it can go up higher needs testing. |
| iprp_spelllvcost.2da | Bonus Spell Slot of Level cost table. | Yes | Yes | Yes | Harccoded | Spells only go from level 0 to 9. |
| iprp_spelllvlimm.2da | Immunity: Spells by Level cost table. | Yes | Yes | Yes | Hardcoded | Spells only go from level 0 to 9. |
| iprp_spells.2da | Item Property: Cast Spell spell list. Not just spells, but things like genades and Activate Item is defined as a "spell". | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added, for custom spells. Cost table so uint16_t |
| iprp_spellshl.2da | Item Property Immunity: Spell School list. | Yes | Yes | Yes | Hardcoded | The spell school list is hardcoded (although the name references could be changed no new ones can be added). |
| iprp_srcost.2dai | Item Property Spell Resistance cost table. | Yes | Yes | Yes | 0 - 65535 | Values can be edited. Cost table so uint16_t |
| iprp_trapcost.2da | Item Property Trap cost table - the index into traps.2da for each trap type at each difficulty level. | Yes | Yes | Yes | 0 - 65535 | You can add more difficulties as new columns needs full page on this. Cost table so uint16_t |
| iprp_traps.2da | Item Property Trap - this is used to define the cost multiplier for the different trap difficulties. | Yes | Yes | Yes | 0 - 65535 | Needs testing. Not hardcoded but unsure of maximum lines. Subtype so uint16_t |
| iprp_visualfx.2da | Item Property Visual FX - used for weapon VFX. Extendable with NWN:EE | Yes | Yes | Yes | 0 - 255 | Can be extended for custom weapon VFX. While it's a subtype the ID used is uint8_t in the engine. |
| iprp_walk.2da | Item Property Special Walk. In EE you can now define more of these and use them properly. | Yes | Yes | Yes | 0 - 65535 | Subtype so uint16_t |
| iprp_weightcost.2da | Item Property Weight Decrease cost table (eg: 80%, 60%). | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added (eg: 0.5, 0.9). Cost table so uint16_t |
| iprp_weightinc.2da | Item Property Weight Increase property table (eg: 5_lbs, 10_lbs). | Yes | Yes | Yes | 0 - 65535 | Additional rows can be added (eg: 5, 10, 15). Cost table so uint16_t |
| itempropdef.2da | Item Property Definitions 2da. This defines what item properties there are in the game. New ones can be added more easily in EE with ItemPropertyCustom, although they show up in the toolset fine. | Yes | Yes | Yes | 0 to 65535 (uint16) | Stored and sent over network as WORD/uint16_t and in the GFF as WORD same as itemprops. Note Subtype values (which don't get their own lookup table) are stored as uint16_t so 0 - 65535 (although the game may limit the value or cast it into smaller numbers so be careful!). |
| itemprops.2da | Item Properties 2da - this defines what items can use what properties. If you want your new item property to be usable on an item it needs adding here. New columns can be added but most new item types reuse an existing column for ease. The server only uses this to validate an item property can exist on a given item (stops scripting adding random properties to random items). Clientside is for some debug function no one can use and Toolset uses it to make the list of what item properties are on what item. | Yes (kinda) | Yes | Yes | 0 to 65535 (uint16) | Stored and sent over network as WORD/uint16_t and in the GFF as WORD same as itempropsdef. |
| itemvalue.2da | Item Value, controlling the items a character of a certain level can equip if the Game Option "Item Level Restrictions" is on (always off in singleplayer). | Yes | Yes | Yes | 0 - 59 | Classes cap at 60 so no need to extend. |
itmwizammo.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizarmor.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizhelmet.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizmelee.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizpotion.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizranged.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizrods.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizscroll.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizstaves.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizthrow.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwiztrap.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| itmwizwands.2da | Toolset only; Item Wizard 2da files | No | No | Yes | 2147483647 (int32) | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| keymap.2da | A special 2da with Action37+ to map specific actions. It's probably not worth editing this ever. | Yes | Yes | No | Hardcoded | Can't add more keyboard actions |
| lightcolor.2da | Seems to define some lighting colours for main and source lights in the toolset and in game. | Yes | Yes | Yes | 0 - 31 | Adding additional rows causes a "List Index Out of Bounds" error in the toolset if you try to edit Tile Properties. |
| loadhints.2da | Load hints used on Load Screens used by the game. Client just gets a random ID to use. | Yes | No | No | 2147483647 (int32) kinda | No network traffic involved, purely clientside and entirely random. If you remove the campaign-only lines (so the random loop choosing them doens't pick them, it doesn't just filter them out before choosing) it'll mean you can use every line, else it'd be good to restrict it to a mere 214,748,364 so it doesn't overflow the loop. |
| loadscreens.2da | Load Screens used by the game. | Yes | Yes | Yes | 0 - 65535 | Uses uint16_t / WORD in the GFF. |
| masterfeats.2da | Master Feats contain other feat options inside them, eg; Weapon Focus. See feat.2da as well. | Yes | Yes | Yes | 0 - 65535 | Limited by number of feats in feat.2da |
| metamagic.2da | Used purely for the toolset, oddly, and otherwise is hardcoded in game. | No | No | Yes | 2147483647 (int32) | Not much point editing since if the values mismatch the games it will just cause issues. No new metamagic can be added. |
| namefilter.2da | Used to filter bad words from the random name generator (toolset also uses this for creature names). It might be good to at least filter out some key NPC names or somesuch here too. Doesn't affect manually input names from the looks of it. To not use this 2da at all blank it out, so the game can't load it. | Yes | Yes | Yes | 2147483647 (int32) | Don't add 2 billion names to filter, but you could! |
| packages.2da | Packages are used by the class system to allow people to not bother choosing level up feats/skills. Button can be removed by ruleset.2da nowadays. Server may use it in LevelUpHenchman, and Toolset can generate NPCs using these packages. | Yes | Yes | Yes | 2147483647 (int32) (8192.36) | GFF field stores your first chosen (level 1) package as a BYTE (0 - 255). Other classes like Prestige classes don't need to be lines 0 - 255. |
| packeqXXX.2da | Equip2DA in packages.2da. Package - Equipment. Can be defined as any name but this is the standard prefix. Validated serverside. | Yes | Yes | Yes | 2147483647 (int32) | You'll fill up their inventory with 2 billion items. PLease don't. |
| packftXXX.2da | FeatPref2DA in packages.2da. Package - Feats. Can be defined as any name but this is the standard prefix. | Yes | Yes | Yes | 2147483647 (int32) | Note there is a Maximum of 255 feats per level chosen giving a lower maximum, technically, of number of level x 255. |
| packskXXX.2da | SkillPref2DA in packages.2da. Package - Skills. Can be defined as any name but this is the standard prefix. | Yes | Yes | Yes | 2147483647 (int32) | Technically limited by the number of rows allowed in skills.2da |
| packspXXX.2da | SpellPref2DA in packages.2da. Package - Spells. Can be defined as any name but this is the standard prefix. Level 0 spells are automatically added I think (need to check how it all works). | Yes | Yes | Yes | 2147483647 (int32) | Maximum of 255 slots per spell level, so only 10 * 255 entries can really exist in a (limited) spellbook. |
| parts_belt.2da | Armor Belt parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_bicep.2da | Armor Bicep parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_chest.2da | Armor Chest parts. This is what really determines the AC of the appearance. The float values are floored. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_foot.2da | Armor Foot parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_forearm.2da | Armor Forearm parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_hand.2da | Armor Hand parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_legs.2da | Armor Legs parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_neck.2da | Armor Neck parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_pelvis.2da | Armor Pelvis parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_robe.2da | Armor Robe parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_shin.2da | Armor Shin parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| parts_shoulder.2da | Armor Shoulder parts. | Yes | Yes | Yes | 0 to 65535 (uint16) | Expanded in EE to WORD (uint16_t) size |
| phenotype.2da | The phenotypes available to fuller player models, eg Humans, so they can have horses, or be "Big". Server sends the ID to the client since it's purely model related. | Yes | No | Yes | 0 - 99 | GFF and game stores as uint8_t but the game makes massive assumptions about 2 digits, so 0 - 99 is the only safe supported numbers. SetPhenotype nwscript command will not work > 99. |
| placeableobjsnds.2da | The sounds placeable objects make when opened/attacked/etc. Server just sends the right ID line to the client to load the sound. | Yes | No | No | 2147483647 (int32) | Just used clientside to lookup from the given placeables.2da column ID. |
| placeables.2da | Placeable object appearances and properties | Yes | Yes | Yes | 0 - 65535 | Network traffic uses WORD and engine uses uint16_t, even though GFF stores a DWORD (uint32_t) |
| placeabletypes.2da | Toolset only 2da used to load the portrait option dropdown for placeable portrait selection. The line ID relates to the portraits.2da InanimateType number. | No | No | Yes | 2147483647 (int32) | |
| poison.2da | Poisons the game uses in EffectPoison. On Hit variant is just pure ability damage. | No | Yes | No | 2147483647 (int32) | |
| polymorph.2da | Polymorphs used by EffectPolymorph which change your character into something else entirely. | No | Yes | No | 2147483647 (int32) | |
| portraits.2da | Portiaits available in the game. Users can use their own portraits (given ruleset.2da settings) but this is the list primarily used. | Yes | Yes | Yes | 0 - 65535 | Needs testing. Field is stored as WORD (0 to 65535) so likely main limit. Runtime might allow higher (temporary) setting though. |
| pregen.2da | Pregenerated characters available to filter in character select. If in this list and the tickbox "Show Pregenreated Characters" is unticked they disappear as they're filtered out. | Yes | No | No | 2147483647 (int32) | The game should load all the rows. Note this is a rare 2da file where the columns are hardcoded, and column "1" is always assumed to be "FILENAME". |
| prioritygroups.2da | The amount and priority of sounds and when they can be interrupted. With EE not sure if they can be dramatically increased or not. | Yes | No | No | Hardcoded | The line references look to be hardcoded engine references. You can alter the values but can't alter the 2da structure. |
| progfx.2da | NWN:EE unhardcoded "programmed effects" values. | Yes | No | No | 0 - 65535 | Limited to uint16_t in engine. |
| pvpsettings.2da | Toolset only list of PvP settings | No | No | Yes | Hardcoded | The PvP settings are hardcoded in the engine. |
| race_feat_xxx.2da | The FeatsTable entry in racialtypes.2da, which grants feats for the given race. | Yes | Yes | Yes | 0 - 65535 | Limited to uint16_t in engine. |
| racialtypes.2da | Racial types the game has, for players and NPCs | Yes | Yes | Yes | 0 - 254 (255 is RACIAL_TYPE_INVALID) | GFF field is set to BYTE (0 - 255) and the game uses uint8_t for a lot of parts of races. |
| ranges.2da | The ranges used for creature perception and spells. | No | Yes | Yes | 0 - 255 | Do not alter or delete the default lines (except maybe the numbers involved) the engine has a lot of hardcoding around them, for spells, player ranges, default monster ranges, etc. TBH easier to leave this alone. GFF field is set to BYTE (0 - 255) thus the line limit. The toolset won't load more options but these can be set in the GFF. |
| repadjust.2da | Reputation adjustments the game makes | No | Yes | No | Hardcoded | Hardcoded list, but values can be altered. |
| replacetexture.2da | This is unused Bioware functionality to replace, on a particular tile, a texture named "replace_tex" by the given texturename linked to in this 2da file. This is...pretty much superceded by an array of texture functions in nwscript now. However who knows you might be able to use it. Bioware probably intended it for flags more than anything going by the contents. Due to no toolset support you'd be hard pressed using this! | Yes | No | No | 0 - 255 | Saved as a BYTE / uint8_t on the GFF ("Tile_ReplaceTex", not settable in the toolset) and sent as such in the network traffic. |
| repute.2da | Toolset only defaults for the faction manager the game uses the modules settings. | No | No | Yes | Hardcoded | Hardcoded standard faction list |
| restduration.2da | Time it takes at each level to rest with ActionRest | No | Yes | No | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. |
| rrf_nss.2da | The dropdown in the toolset when opening a script has these categories and simple filters available. | No | No | Yes | 0 - 31 | You can have a max of 32 load by the toolset dropdown. |
| rrf_wav.2da | The dropdown in the toolset when opening a sound file has these categories and simple filters available. | No | No | Yes | 0 - 31 | You can have a max of 32 load by the toolset dropdown. |
| ruleset.2da | NWN:EE allows some unhardoding of default feats and values the game uses, some very useful client side only options too. | Yes | Yes | Yes | Hardcoded / not relevant | All values are hardcoded - but are tied to the LABEL column (by text identifier) not the line ID. |
| savingthrowtypes.2da | Allows altering the default saving throw types (eg Cold, Fire, Death) and add new ones the client will correctly see. Need to also edit iprp_saveelement for the item property versions. | Yws | Yes | No | 0 - 255 | Unhardcoded in patch 37. Network limitations are why it's only a byte maximum. |
| skills.2da | Skills list for players. Note that many lines are hardcoded (eg; Parry) and new skills will be missing relevant skill increasing feats (eg; Skill Focus). | Yes | Yes | Yes | 0 - 255 | Hardcoded due to network limitations to 255. Previous issues in EE exists for skills appearing even if set to particular settings (eg needing training). |
| skillvsitemcost.2da | The amount of skill needed by Use Magical Device to equip a particular magic item due to restrictions due to class/alignment/race and the amount to identify an item with the Lore skill. Toolset just sues it for Lore levels. | No | Yes | Yes | 2147483647 (int32) | Uses a loop of the 2da to find the right cost when looking up something to check. |
| skyboxes.2da | Skybox model list. Skybox ID from the area is sent to client, server doesn't validate the 2da. Toolset uses it to load the list of available skyboxes. | Yes | No | Yes | 0 - 255 | GFF field is BYTE (0-255) and the game engine stores it in memory as uint8_t. |
| sounddefaultspos.2da | Default values for toolset placeable sound types (positions) | No | No | Yes | Hardcoded | The toolset columns and rows are hardcoded for these. |
| sounddefaultstim.2da | Default values for toolset placeable sound types (timings) | No | No | Yes | Hardcoded | The toolset columns and rows are hardcoded for these. |
| soundeax.2da | EAX values are still in the toolset mainly for compatibility, as of EE they are no longer used. | No | No | Yes | Hardcoded | Hardcoded but unused by the game so who cares. |
| soundset.2da | Soundset references. | Yes | No | Yes | 0 to 65535 (uint16) | GFF field stores it as WORD (0 to 65535) and the game generally uses uint16_t to store it. |
| soundsettype.2da | Column "Type" in soundset.2da refers to this. The categories of soundset file in the toolset, unused out of the toolset however since only 0 matters for chargen (PC voicesets) | No | No | Yes | 0 - 255 | The client technically loads this but does nothing with it. It instead hardcodes the values so only 0 and 2 work for PCs. However it does store the values retrieved from soundset.2da referring to this 2da in a uint8_t array. The toolset could potentially use higher values but do you really need that many categories? |
| spells.2da | Spells and abilities usable by creatures | Yes | Yes | Yes | 0 - 65535 | 65535 is the likely limit of this due to having 0xFFFF as the mask for the spell ID in the quickbar. BIC saving and loading uses WORD (65535) and there may be other assumptions of the engine around uint16_t as well. Going over this might work for creature and placeable only cast spells but 65K spells is quite a bit! |
| spellschools.2da | Spell schools. The amount is hardcoded but you should be able to alter the TLK strings now. | Yes | Yes | No | Hardcoded | Hardcoded list |
| statescripts.2da | State scripts run when under the effect of certain effects, also shows the games default priority list for them | No | Yes | No | Hardcoded | Entirely hardcoded. |
| stringtokens.2da | String tokens like <Man/Woman> used in conversations and in general. See Conversations. You can actually add your own to this file. I haven't tested if it runs properly serverside (ie GetStringByStrRef) but likely not, instead it sends the data to the client to be sorted locally. | Yes | Yes | Yes | 2147483647 (int32) (in fact uint32_t) | The game uses uint32_t which obviously precludes using Get2DAString if you really had 4 billion entries to add. |
| surfacemat.2da | Surface material definitions, such as grass/water/lava. In EE now extended with actions and able to be affected in hakpack files. | Yes | Yes | Yes | 0 - 63 | 0 through 63 are valid lines for this in patch 1.84.8193.29 and up. |
| swearfilter.2da | Stops showing (some) swearing in the game clientside if [ui.chat.swear-filter] is enabled in settings.tml. Servers send messages and clients then filter it. Doesn't stop swearing being sent however, and can't be enabled serverside. Note the columns cannot be rearranged, about the only 2da this matters. | Yes | No | No | 2147483647 (int32) | Looks to read every line in the 2da. |
| tailmodel.2da | Tailmodel reference file. Note that Bioware added a lot of "real" models to be used with invisible appearance things for scaling. Bit unnecessary nowadays in EE! Server just sends the ID number to the client to load the model in this file. | Yes | No | Yes | 2147483647 (int32) | Given there are over 5000 lines the answer is "High" |
| tilecolor.2da | Loaded by the game but does it do anything. Used in the toolset. | Yes | No | Yes | Doesn't really matter/don't touch | Doesn't appear to be in use by the game. |
| XXX_edge.2da | Tileset edge information. One per tileset. | No | Yes | Yes | 2147483647 (int32) | Engine should read every row. But I don't think you'll need that many edge tiles defined... |
| traps.2da | Traps, which are item properties and the placed on objects/as trap triggers on the ground. | Yes | Yes | Yes | 0 - 255 | Limited to BYTE / uint8_t in engine/network traffic, and stored in GFF as BYTE too. See traps.2da for info on how builder-placed unrecoverable traps don't need unique lines. |
| vfx_persistent.2da | Persistent VFX, ie items created with EffectAreaOfEffect. | Yes | Yes | No | 2147483647 (int32) (8192.36) | In patch 8193.36 it is increased to 2147483647 (int32) (previously was 0 - 255 when applied to a object (a mobile area of effect) but can be over 255 if placed on the gorund (static AOE)) |
| visualeffects.2da | Visual Effects the game uses, called from the game (see Hardcoded VFX References) or by EffectVisualEffect. | Yes | Yes | No | 0 - 65535 | Network traffic is limited to uint16_t (WORD) size for the line ID. Don't use 999, it's the cow cheat VFX special line. |
| waypoint.2da | Toolset only waypoint definition file. Basically waypoints are not "real" so this defines the different types so they show properly in the toolset with a model. | No | No | Yes | 0 - 255 | Limited to Byte |
| weaponsounds.2da | This is a file referenced for sounds from baseitems.2da, what is being used labelled on the left, and the thing it is hitting as a column name. Note whips get special behaviour. | Yes | No | No | 0 - 255 | Weapon material type in baseitems.2da is truncated to 0 - 255 entries. |
| weathertypes.2da | Weather related 2da. Server just tells client which line number to load. | Yes | No | No | 0 - 255 | Is maximum of uint8_t and sent as BYTE and stored in GFF (also savegames) as BYTE. |
| wingmodel.2da | Wing models reference file. Wings are things on the back node so can include weapons and scabbards etc. Server just sends the reference ID number for the client to load. | Yes | No | No | 2147483647 (int32) | Sent on the network as DWORD and saved/loaded in GFF as DWORD which is great. |
xpbaseconst.2da | Is loaded as XP Base Constant, used for death calcuation by looking up | |||||
| xptable.2da | Used to value the XP given from monsters using the default game XP. If you set the XP slider in the module to 0 it will disable killer XP from this file, then you can grant your own XP on death. | No | Yes | No | 40 or 60 | Players can only be level 40 normally so the file only goes up to 40. NPCs can be 60. |
parts_xxx.2da files
**This section applies to ALL parts 2da files EXCEPT parts_robe.2da**
The toolset indexes each part according to the float value assigned to the ACBONUS column in descending order (e.g., 0.00 is listed at the top and 8.00 at the bottom of the Toolset dropdown menus). You can sort parts with the same ACBONUS value using the two digits to the right of the decimal in the float value (e.g., 0.01, 0.02, 0.03).
The ACBONUS column is NOT used by any parts 2da EXCEPT parts_chest.2da. Here, the float value is used to determine the AC of that particular chest piece. However, only the digit to the left of the decimal matters - as in other parts 2da files, the right digits can be used to index chest pieces within their respective ACBONUS values (e.g., 8.01, 8.02, 8.03, etc.).
NOTE, in most cases a body part's model number will NEVER match its number in the Toolset dropdown menu.
Designer 2da files
These are strictly used by Get2DAString and not used by the game inherently. However the systems they relate to are things like crafting, which is called by default game scripts and conversations the PCs can activate.
They are all prefixed des_ - and being only used by Get2DAString they are serverside only.
There is one special case here: x3restrict.2da is used in the default game spells to restrict polymorph spells when casting on a horse. Added for horse support.
Client and Serverside 2das
The game as a whole is made up of the client and the server. A singleplayer game essentially runs both at once for the local user - of course other players may still join if it is created as a network game. Therefore it is important to understand which is which, since some 2da files you don't need to include at all in hakpack or nwsync resource lists, and can be left in the .mod or override folder on a PW server perfectly fine.
The client ones tend to be based around levelling up, appeareances, visuals (icons, vfx, textures, etc.) and sounds (the latter 3 servers don't even load of course). Servers need to know about all the resources loaded by the game in regards to objects, spells, etc. and you can read any "clientside only" 2da file with Get2DAString.
Therefore it is recommended of course for the server to have copies of everything (if only for Get2DAString lookups) while you can lessen the amount put in client hakpacks or on nwsync if sending certain ones to the client.
The list of what is clientside and serverside and toolset is included in the table above.
Unused 2da files
Bioware left in some 2da files from early development (before game release) or they're now unused in NWN:EE. These files are not loaded by the game, toolset or Get2DAString at all and can be ignored. They do get confusing however.
| 2da File Name | Type | Notes |
|---|---|---|
| areaeffects.2da | Unused | See vfx_persistent.2da instead |
| armorparts.2da | Unused | While it appeared to maybe at one time sort the separate armor parts out, it doesn't seem to be used by the toolset and instead the differnet parts_XXX.2da files are used, and for heads it just lists all the models. |
| armourtypes.2da | Unused | While the GFF documentation suggests it is used, the game really just ignores it and uses defaultacsounds.2da to look up which AC value gets which sound effect. 0 being no armor or clothing. |
| caarmorclass.2da | Unused | Early armor class system or holdover from an older game perhaps. |
| categories.2da | Unused | Not loaded by the game, in fact not even a valid 2da file (it's missing line 0). The constants for TALENT_CATEGORY_XXX are just hardcoded in the engine. Adding things to do this does nothing. |
| catype.2da | Unused | "P", "H", "GIHE", "C", "A" - mysterious! category types? Early phenotype listing? Or model complexity listing? |
| combatmodes.2da | Unused | Unused references to (a limited set) of combat action modes |
| doortype.2da | Unused | See doortypes.2da instead |
| effectanim.2da | Unused | Pretty much a blank file. See visualeffects.2da instead |
| gamespyrooms.2da | 1.69 only | Gamespy no longer used / this isn't used |
| iprp_bladecost.2da | Unused | "Dancing_Scimitar" IPRP 2da file by the looks of it, alas an unusable item property |
| iprp_kitcost.2da | Unused | Probably was once used for Healing Kits, or Trap Kits, but they use iprp_skills.2da which is a copy of this 1:1. |
| iprp_material.2da | Unused | Replaced by iprp_matcost.2da which is referenced and used. |
| iprp_monsterdam.2da | Unused | Seems to be unused since creature weapons use a base item type to define the Monster Damage item property damage. Since it contains an entry for "Bite/Rend" it was probably tested this way and then changed in development. |
| iprp_slotscost.2da | Unused | Blank, maybe at some stage the inventory was more BG style and "slot cost" was to do with extending it. |
| iprp_staminacost.2da | Unused | Blank, obviously no stamina in the game |
| iprp_terraintype.2da | Unused | Blank but would have obviously been used for the "Restriction: Terrain" item property. |
| iprp_trapsize.2da | Unused | Is unused given it's not referenced in any 2da file, and misses the "Epic" mokier so the toolset doesn't use it. Maybe a pre-release had traps of varying ground size and it is a leftover. |
| nwconfig.2da | 1.69 only | Unused as of NWN:EE since it removes the "settings" nwconfig program. |
| nwconfig2.2da | 1.69 only | Looks like it's something to do with the legacy launcher which popped up before running 1.69 |
| resistancecost.2da | Unused | Blank 2da file, probably from early dev |
| soundcatfilters.2da | Unused | Replaced probably by rrf_wav.2da and would be toolset specific anyway |
| soundgain.2da | Unused | Seems to be unused by the game and toolset, but should define the loudness and distance of sounds. Given theg ames default perception range is 45M maybe at one point you could see much further (up to 100M!) |
| soundprovider.2da | 1.69 only | As of EE this is no longer used, since it refers to Miles and EAX both of which were replaced with OpenAL |
| soundtypes.2da | Unused | Sounds are not tied to a 2da, but are done by resource name |
| treasurescale.2da | Unused | I don't think this is used anywhere of note. It'd be used in the toolset I'd guess but there isn't a treasure generation system there. Possibly was part of early Item Wizard generations (instead it gives a magic item range, None to Godly). |
| vfx_fire_forget.2da | Unused | Pretty early dev file, very empty. See visualeffects.2da instead. |
| videoquality.2da | 1.69 only | No longer used in EE, was the old 1.69 video quality settings - in the launcher I think |