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.
The 2da format is relatively simple, and can be read about in the Bioware documentation:
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.
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 comatibility, and where **** can actually be counted as "Empty value" instead of "Missing value" meaning different behaviour.
The game generally won't care what order columns are in except for some minor exceptions;
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).
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.
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 restricted due to network traffic (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 (presumably...)
| 2da file | Brief Description | Client Loaded | Server Loaded | Toolset Loaded | 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 | Unknown | Needs testing. GFF field is stored as INT (-2147483648 to 2147483647). |
| ambientsound.2da | Ambient sound tracks | Yes | No | Yes | Unknown | Needs testing. 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 | No | No | Unknown / Hardcoded | Likely hardcoded, so no changes to line amounts allowed. |
| appearance.2da | Creature appearances and base properties like size etc. | Yes | Yes | Yes | Unknown | GFF field is stored as WORD (0 to 65535). |
| appearancesndset.2da | Appearance Sound Set eg what ambient sound they play, referenced by SOUNDAPPTYPE in appearance.2da | Yes | No | Yes? | Unknown | Needs testing. More can be added but not sure about the line limit. |
| armor.2da | List of armor values, although some of this is hardcoded. | Yes | Yes | Yes | Unknown | Needs testing. New AC values can be added but only incrementally (so higher AC, eg: 8, 9, 10 could be added next). |
| armorparts.2da | Used for the toolset to set how many of each part of armor there are. | No | No | Yes | Hardcoded | There is a single line used by the toolset, no additional lines are even needed. |
| baseitems.2da | All the item types in the game (eg: longsword, torch, scroll) | Yes | Yes | Yes | 255 | Hardcoded due to network limitations; items may not function as intended. |
| bodybag.2da | The bodybag a creature will leave around. | No | Yes | Yes | Likely 255 | Needs testing. GFF field is stored as BYTE (0 to 255) |
| chargenclothes.2da | Clothing available at character generation. | Yes | Yes | No | Unknown | Needs testing. 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 | Yes | Yes | Yes | 254 | Hardcoded due to network limitations plus "255" number is reserved as "CLASS_TYPE_INVALID" |
| cloakmodel.2da | Cloaks model references and options for each model. | Yes | Yes | Yes | Unknown | Needs testing. |
| 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 |
| cls_bfeat_xxx.2da | Standard name for classes.2da "BonusFeatsTable" 2da value, defining the bonus feats a class gets | Yes | Yes | Yes | Unknown | Needs testing but likely the limit here is same as feat.2da |
| cls_feat_xxx.2da | Standard name for classes.2da "FeatsTable" 2da value, defining the feat availability for a class | Yes | Yes | Yes | Unknown | Needs testing but likely the limit here is same as feat.2da |
| cls_pres_xxx.2da | Standard name for classes.2da "PreReqTable" 2da value, defining the prerequisits for taking this (Prestiege) class | Yes | Yes | Yes | Unknown | Needs testing but this is hardly going to ever be the longest file. |
| 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 | Unknown (likely 255) | Needs testing but is likely limited to the same size as skills.2da (255 or 32 depending on bugs) |
| 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 | Unknown | Needs testing. This file can be extended but 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 | Unknown | Needs testing. 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 | Likely 255 | Needs testing. GFF field is stored as BYTE (0 - 255) |
| damagehitvisual.2da | Damage VFX line sent to the client when a particular damage is inflicted by a weapon. | No | Yes | No | Hardcoded | The amount of damage types is hardcoded. |
| 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 | Unknown | Needs testing. 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 | Unknown | Needs testing. |
| domains.2da | Domains that by default only Clerics use, but now in EE any spellcaster can be assigned if setup. | Yes | Yes | No | Likely 255 | Needs testing. 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. | Yes | Yes | Yes | Unknown | |
| effecticons.2da | Effect icons used by the game, now extendable massively in EE with EffectIcon. | Yes | Yes | No | 255 | This 255 limit was set properly in EE for EffectIcon. Previously all effect icons were hardcoded. |
| encdifficulty.2da | Encounter difficulty. Used by servers for a multiplier on the "difficulty", and in toolset to set the difficulty. | No | Yes | Yes | Unknown | Needs testing. Not sure if more can be added. GFF field is stored as INT (-2147483648 to 2147483647). |
| 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 | Unknown | Needs testing. Rows go up to 100 but potentially could be extended. |
environment.2da | Contains the area lighting environmental presets available in the toolset only. | No | No | Yes | Unknown | Needs testing. May be hardcoded. |
| epicattacks.2da | Attack progression for epic levels (21+). Clients and toolset is just for showing numbers. | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. Note the epic levels are 21+ so first 20 lines would be ignored usually. |
| epicsaves.2da | Save progression for epic levels (21+). Clients and toolset is just for showing numbers. | Yes | Yes | Yes | 60 | Classes are limited to 40 levels for PCs and 60 levels (mostly) for NPCs. Note the epic levels are 21+ so first 20 lines would be ignored usually. |
| 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 | 32,768 | uint16 used in network however not recommended to go over 32K even if 65,536 is absolute maximum. There are likely problems with subdial feats if you do this. |
| footstepsounds.2da | Sound files loaded for particular footsteps depending on appearance. | Yes | No | No | Unknown | Needs testing. |
| 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 | Unknown | Needs testing. |
| 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 | Unknown | Needs testing. |
| 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 | Unknown | Needs testing. |
| 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 | Unknown | Needs testing. |
| iprp_abilities.2da | Yes | Yes | Yes | |||
| iprp_acmodtype.2da | Yes | Yes | Yes | |||
| iprp_addcost.2da | Yes | Yes | Yes | |||
| iprp_additional.2da | Yes | Yes | Yes | |||
| iprp_aligngrp.2da | Yes | Yes | Yes | |||
| iprp_alignment.2da | Yes | Yes | Yes | |||
| iprp_ammocost.2da | Yes | Yes | Yes | |||
| iprp_ammotype.2da | Yes | Yes | Yes | |||
| iprp_amount.2da | Yes | Yes | Yes | |||
| iprp_arcspell.2da | Yes | Yes | Yes | |||
| iprp_bonuscost.2da | Yes | Yes | Yes | |||
| iprp_chargecost.2da | Yes | Yes | Yes | |||
| iprp_color.2da | Yes | Yes | Yes | |||
| iprp_combatdam.2da | Yes | Yes | Yes | |||
| iprp_costtable.2da | Yes | Yes | Yes | |||
| iprp_damagecost.2da | Yes | Yes | Yes | 127 (or possibly 128) | 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 | Yes | Yes | Yes | |||
| iprp_damvulcost.2da | Yes | Yes | Yes | |||
| iprp_feats.2da | Yes | Yes | Yes | |||
| iprp_immuncost.2da | Yes | Yes | Yes | |||
| iprp_immunity.2da | Yes | Yes | Yes | |||
| iprp_kitcost.2da | Yes | Yes | Yes | |||
| iprp_lightcost.2da | Yes | Yes | Yes | |||
| iprp_matcost.2da | Yes | Yes | Yes | |||
| iprp_material.2da | Yes | Yes | Yes | |||
| iprp_meleecost.2da | Yes | Yes | Yes | |||
| iprp_monstcost.2da | Yes | Yes | Yes | |||
| iprp_monsterdam.2da | Yes | Yes | Yes | |||
| iprp_monsterhit.2da | Yes | Yes | Yes | |||
| iprp_neg10cost.2da | Yes | Yes | Yes | |||
| iprp_neg5cost.2da | Yes | Yes | Yes | |||
| iprp_onhit.2da | Yes | Yes | Yes | |||
| iprp_onhitcost.2da | Yes | Yes | Yes | |||
| iprp_onhitdur.2da | Yes | Yes | Yes | |||
| iprp_onhitspell.2da | Yes | Yes | Yes | |||
| iprp_paramtable.2da | Yes | Yes | Yes | |||
| iprp_poison.2da | Yes | Yes | Yes | |||
| iprp_protection.2da | Yes | Yes | Yes | |||
| iprp_qualcost.2da | Yes | Yes | Yes | |||
| iprp_quality.2da | Yes | Yes | Yes | |||
| iprp_redcost.2da | Yes | Yes | Yes | |||
| iprp_resistcost.2da | Yes | Yes | Yes | |||
| iprp_saveelement.2da | Yes | Yes | Yes | |||
| iprp_savingthrow.2da | Yes | Yes | Yes | |||
| iprp_skillcost.2da | Yes | Yes | Yes | |||
| iprp_slotscost.2da | Yes | Yes | Yes | |||
| iprp_soakcost.2da | Yes | Yes | Yes | |||
| iprp_spellcost.2da | Yes | Yes | Yes | |||
| iprp_spellcstr.2da | Yes | Yes | Yes | |||
| iprp_spelllvcost.2da | Yes | Yes | Yes | |||
| iprp_spelllvlimm.2da | Yes | Yes | Yes | |||
| iprp_spells.2da | Yes | Yes | Yes | |||
| iprp_spellshl.2da | Yes | Yes | Yes | |||
| iprp_srcost.2dai | Yes | Yes | Yes | |||
| iprp_trapcost.2da | Yes | Yes | Yes | |||
| iprp_traps.2da | Is this used? to test, maybe just in toolset? | ??? | ??? | ??? | ||
| iprp_trapsize.2da | Yes | Yes | Yes | |||
| iprp_visualfx.2da | Yes | Yes | Yes | |||
| iprp_walk.2da | Yes | Yes | Yes | |||
| iprp_weightcost.2da | Yes | Yes | Yes | |||
| iprp_weightinc.2da | Yes | Yes | Yes | |||
| itempropdef.2da | Yes | Yes | Yes | |||
| itemprops.2da | Yes | Yes | Yes | |||
| itemvalue.2da | Yes | Yes | Yes | |||
itmwizammo.2da | Toolset only; Item Wizard 2da files | No | No | Yes | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | 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 | Unknown | Item Wizards are not something anyone realistically will edit much so no doubt no one will test this. |
| keymap.2da | Even though it doesn't have identifying ID lines, it appears this is used to determine a lot key bindings (maybe defaults in some cases?) | 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 | Unknown | Needs testing, would be interesting if it was expandable. |
| loadhints.2da | Load hints used on Load Screens used by the game. Client just gets a random ID to use. | Yes | No | No | Unknown | Needs testing. Since it's not used in network traffic it doubtless can be quite high. |
| loadscreens.2da | Load Screens used by the game. | Yes | Yes | Yes | Unknown | Needs testing. |
| masterfeats.2da | Master Feats contain other feat options inside them, eg; Weapon Focus. See feat.2da as wlel. | Yes | Yes | Yes | Unknown | Needs testing. |
| namefilter.2da | Used to filter bad words from the random name generator. | Yes | Maybe? | No | Unknown | Needs testing. |
| 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. | |||||
| packeqXXX.2da | ||||||
| packftXXX.2da | ||||||
| packskXXX.2da | ||||||
| packspXXX.2da | ||||||
| parts_belt.2da | ||||||
| parts_bicep.2da | ||||||
| parts_chest.2da | Armor Chest parts. This is what really determines the AC of the appearance. The float values are floored. | |||||
| parts_foot.2da | ||||||
| parts_forearm.2da | ||||||
| parts_hand.2da | ||||||
| parts_legs.2da | ||||||
| parts_neck.2da | ||||||
| parts_pelvis.2da | ||||||
| parts_robe.2da | ||||||
| parts_shin.2da | ||||||
| parts_shoulder.2da | ||||||
| phenotype.2da | The phenotypes available to fuller player models, eg Humans, so they can have horses, or be "Big". | |||||
| placeableobjsnds.2da | ||||||
| placeables.2da | Placeable object appearances and properties | |||||
| poison.2da | Poisons the game uses in EffectPoison. On Hit variant is just pure ability damage. | |||||
| polymorph.2da | Polymorphs used by EffectPolymorph which change your character into something else entirely. | |||||
| 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 | Unknown | Needs testing. Field is stored as WORD (0 to 65535). |
| 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 | Unknown | Needs testing. |
| 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. |
| progfx.2da | NWN:EE unhardcoded "programmed effects" values. | Yes | No | No | Unknown | Likely same limit as visualeffects.2da if there is one |
| 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 feats granted when a race is chosen. | Yes | Yes | Yes | Unknown | Needs testing. |
| racialtypes.2da | Racial types the game has, for players and NPCs | Yes | Yes | Yes | 255 likely | Needs testing. GFF field is set to BYTE (0 - 255) |
| ranges.2da | The ranges used for creature perception and spells. | No | Yes | No | Hardcoded | Range types are hardcoded to engine values. |
| repadjust.2da | Reputation adjustments the game makes | No | Yes | No | Hardcoded | Hardcoded list, but values can be altered. |
| replacetexture.2da | Not really sure what this does. Tiles related? | Yes | No | No | Unknown | Needs testing. |
| 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 | Unknown | Needs testing. |
| rrf_wav.2da | The dropdown in the toolset when opening a sound file has these categories and simple filters available. | No | No | Yes | Unknown | Needs testing. |
| 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 | All values are hardcoded to particular lines of course. |
| 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 | 32 | Hardcoded due to network limitations to 255 but GUI issues make it a 32 skill limit. May only affect the "Untrained" column however? https://github.com/Beamdog/nwn-issues/issues/171 |
| 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. | No | Yes | No | Unknown | Needs testing. No doubt it could be increased in numbers though to have more granular control. |
| 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 | Likely 255 | Needs testing. GFF field is BYTE (0-255) |
| sounddefaultspos.2da | Default values for toolset placeable sound types | No | No | Yes | Hardcoded | Toolset uses this for the default values of the different placeable sound types. |
| sounddefaultstim.2da | Default values for toolset placeable sound types | No | No | Yes | Hardcoded | Toolset uses this for the default values of the different placeable sound types. |
| 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 | 65535 Likely | Needs testing. GFF field stores it as WORD (0 to 65535) |
| 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 | Unknown | Needs testing. |
| spells.2da | Spells and abilities usable by creatures | Yes | Yes | Yes | 4096 | Possibly the limit - needs testing, but is to do with 12 bits available for the "spell radial" entry being sent over the network. May have been removed at some point but needs fully testing. |
| 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. | No | Yes | Yes | Unknown | Needs testing, can new ones be even added? |
| 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 | 64 | 0 through 63 are valid lines for this in patch 1.84.8193.29 and up. |
| swearfilter.2da | Stops swearing in the game if [ui.chat.swear-filter] is enabled in settings.tml (I think this is a client only option? Needs testing!). Note the columns cannot be rearranged for whatever reason. | Yes | Yes | No | Unknown | Needs testing. |
| 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 | Unknown | Given there are over 5000 lines the answer is "High" |
| tilecolor.2da | Loaded by the game but does it do anything or does lightcolor.2da | No | Yes | Unknown | Unknown | Needs testing (if it's even in use). |
| XXX_edge.2da | Tileset edge information. One per tileset. | No | Yes | Yes | Unknown | Needs testing. |
| traps.2da | Traps, which are item properties and the placed on objects/as trap triggers on the ground. | Yes | Yes | Yes | Unknown | Needs testing. |
| vfx_persistent.2da | Persistent VFX, ie items created with EffectAreaOfEffect. | No | Yes | No | Unknown | Needs testing. |
| visualeffects.2da | Visual Effects the game uses, called from the game (see Hardcoded VFX References) or by EffectVisualEffect. | Yes | Yes | No | Unknown | Needs testing. |
| 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 | Unknown | Needs testing. |
| 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. | Yes | No | No | Unknown | Needs testing. |
| weathertypes.2da | Weather related 2da. Server just tells client which line number to load. | Yes | No | No | Unknown | Needs testing. |
| 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 | Unknown | Needs testing. |
| 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. |
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 |
| 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_base1.2da | Unused | Blank unused IPRP file |
| iprp_bladecost.2da | Unused | "Dancing_Scimitar" IPRP 2da file by the looks of it, alas an unusable item property |
| 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. |
| metamagic.2da | Unused | Appears to be unused by the game making all of these hardcoded references, similar to categories.2da how it looks usable but isn't |
| 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 |
| placeabletypes.2da | Unused | I think an old toolset 2da, now there are proper pallets for placeable types |
| 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 |
xpbaseconst.2da | Unused | Seems to not be in use when file is altered so likely some old XP system file |
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.
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.
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.
Note: If a file is not listed here (or above as a toolset only, or unused one) it might still be used!
| 2da load reference | 2da Name | Notes |
|---|---|---|
| m_paIPRPCostTables // all of them | All cost tables in iprp_costtable.2da column "Name" | Example: iprp_bonuscost.2da |
| m_pAppearanceTable | appearance.2da | |
| m_pGenderTable | gender.2da | |
| m_pSurfaceMaterialTable | surfacemat.2da | Loaded at game start so you cannot change it in a hakpack file, only in the override folder |
| m_pVisualEffectTable | visualeffects.2da | |
| m_pPersistentVisualEffectTable | vfx_persistent.2da | |
| m_pCreatureSpeedTable | creaturespeed.2da | |
| m_pDoorTypesTable | doortypes.2da | |
| m_pGenericDoorsTable | genericdoors.2da | |
| m_pPlaceablesTable | placeables.2da | |
| m_pAreaTransitionTable | loadscreens.2da | |
| m_pIPRPSpells | iprp_spells.2da | |
| m_pIPRPLightTable | Not sure - probably iprp_lightcost.2da ? | |
| m_pIPRPColor | iprp_color.2da | |
| m_pIPRPMelee | iprp_meleecost.2da | |
| m_pItemPropDefTable | itempropdef.2da | |
| m_pItemPropsTable | itemprops.2da | |
| m_pCreatureSizeTable | creaturesize.2da | |
| m_pArmorTable | armor.2da | |
| m_pEncumbranceTable | encumbrance.2da | |
| m_pPortraitTable | portraits.2da | |
| m_pPartsChest | parts_chest.2da | |
| m_pSpellSchoolTable | spellschools.2da | |
| m_pTrapTable | traps.2da | |
| m_pLightColorTable | lightcolor.2da | |
| m_pIPRPDamageTable | iprp_damagecost.2da | |
| m_pPartsRobe | parts_robe.2da | |
| m_pItemValue | itemvalue.2da | |
| m_pPackages | packages.2da | Presumably also all the relevant class package 2das |
| chargenclothes.2da | Clothing items must be part of the base game, or included in the hak as UTI resources | |
feat.2da masterfeats,2da | Likely needed for both (chargen needs feat.2da, and server obviously needs it for backend stuff) | |
| namefilter.2da | No bad words, naughty! Probably char gen only? | |
| swearfilter.2da | No swearing for you! | |
| prioritygroups.2da | Sound related but may be just client side (along with some others) usually never edited by hakpacks anyway. |
While many of these are only loaded by the game client, the toolset would still make regular use of them, for instance, to be able to have a blueprint reference a particular wing model on a suitable NPC.
It is always recommended to have these available on the server if only for Get2DAString lookups.
| 2da load reference | 2da Name | Notes |
|---|---|---|
| m_pPartTable | Not sure? | Model appearance related |
| m_pArmorTypesTable | armourtypes.2da | Sounds loading (cloth, leather, plate, chain) |
| m_pTileColorTable | tilecolor.2da | Texture loading |
| m_pReplaceTextureTable | replacetexture.2da | Texture loading |
| m_pTailModelTable | tailmodel.2da | Model appearance related |
| m_pWingModelTable | wingmodel.2da | Model appearance related |
| m_pCloakModelTable | cloakmodel.2da | Model appearance related Note: CopyItemAndModify() may use this server-side in some instances (non-PLT based ones which there are none in the base game). |
| m_pCursorTable | cursors.2da | For the cursors for certain default game actions. |
| m_pActionsTable | actions.2da | For GUI icons list (player action list top left) |
| m_pAmbientMusicTable | ambientmusic.2da | Server tells client which line to load, which refers to this for the sound files |
| m_pAmbientSoundTable | ambientsound.2da | Server tells client which line to load, which refers to this for the sound files |
| m_pFootstepSoundsTable | footstepsounds.2da | Sounds loading |
| m_pAppearanceSoundsTable | appearancesndset.2da | Sounds loading |
| m_pWeaponSoundsTable | weaponsounds.2da | Sounds loading |
| m_pDefaultACSoundsTable | defaultacsounds.2da | Sounds loading |
| m_pAmmunitionTypesTable | ammunitiontypes.2da | Sounds loading |
| m_pKeymapTable | keymap.2da | Client GUI default keys/shortcuts |
| m_pPlaceableSoundsTable | placeableobjsnds.2da | Sounds loading |
| m_pDamageLevelTable | GUI showing how damaged something is (Formats the text over creatures heads) | |
| m_pEffectIconsTable | effecticons.2da | GUI effect icons (top right, inspect panel on items/characters, character sheet) |
| m_pLoadHintsTable | loadhints.2da | Loading string text loading |
| m_pSwearFilterTable | swearfilter.2da | It's funny how this is here. I presume it alters incoming messages not outgoing ones? Needs testing. Servers can implement changes to PC chat to implement a filter using OnPlayerChat event. |
| m_pPhenoTypeTable | phenotype.2da | Model appearance related |
| m_pIPRPVisualFxTable | iprp_visualfx.2da | Visual effects |
| m_pWeatherTypesTable | weathertypes.2da | Client is just told which line to load |
| 2da load reference | 2da Name | Notes |
|---|---|---|
| Any custom 2da | eg: des_crft_aparts.2da | Loaded with Get2DAString so entirely script based access |
| m_pStateScriptsTable | statescripts.2da | Runs specific scripts |
| m_pPoisonTable | poison.2da | Applies effects / timings of effect changes |
| m_pDiseaseTable | disease.2da | Applies effects / scripts / timing of effect changes |
| m_pRepAdjustmentsTable | repadjust.2da | Engine changes to "reputation" ie; if they're hostile or not. |
| m_pFractionalCRTable | fractionalcr.2da | Works out how much a goblin with 1/4CR is "worth" in the engine XP system/"difficulty" tags (eg; "Easy" enemy when inspected) |
| m_pEncounterDifficultyTable | encdifficulty.2da | The "value" column is loaded when referenced from the encounters GFF |
| m_pCategoryTable | categories.2da | Used by the functions for talents. Some is hardcoded (eg; potion lines). So yeah. |
| m_pExcitedDurationTable | excitedduration.2da | Presumably amount of time in milliseconds (so 10 seconds) the thing is considered in combat after the events listed |
| m_pRestDurationTable | restduration.2da | Amount of milliseconds to sit on the ground for |
| m_pPartsBelt | parts_belt.2da | |
| m_pPartsBicep | parts_bicep.2da | |
| m_pPartsFoot | parts_foot.2da | |
| m_pPartsForearm | parts_forearm.2da | |
| m_pPartsHand | parts_hand.2da | |
| m_pPartsLegs | parts_legs.2da | |
| m_pPartsNeck | parts_neck.2da | |
| m_pPartsPelvis | parts_pelvis.2da | |
| m_pPartsShin | parts_shin.2da | |
| m_pPartsShoulder | parts_shoulder.2da | |
| m_pXpBase | xptable.2da | Used for giving out XP |
| m_pAssociatesAnimalCompanionTable | hen_companion.2da | |
| m_pAssociatesFamiliarTable | hen_familiar.2da | |
| m_pSkillVsItemCostTable | skillvsitemcost.2da | |
| m_pRangesTable | ranges.2da | Note the "45.0M" range for streaming in usable placeables is hardcoded, and a maximum of visibility regardless of values here of any creature object. |
| m_pPolymorphTable | polymorph.2da | |
| m_pDamageHitVisualTable | damagehitvisual.2da | Sends a relevant visualeffect.2da line number to the client |
| m_pBodyBagTable | bodybag.2da | References a placeables.2da line |
| m_pIPRPFeatsTable | iprp_feats.2da | |
| m_pIPRPMonsterDamageTable | iprp_monsterdam.2da | |
| m_pOnHitTable | iprp_onhit.2da | Note this pretty much is hardcoded |
| m_pOnHitSpellTable | iprp_onhitspell.2da | |
| m_pOnHitDurationTable | iprp_onhitdur.2da | |
| m_pIPRPACModTypeTable | iprp_acmodtype.2da | |
| m_pIPRPWeightIncTable | iprp_weightinc.2da | |
| m_pIPRPArcSpell | iprp_arcspell.2da | |
| m_pIPRPBonusCostTable | iprp_bonuscost.2da | |
| m_pIPRPSRCostTable | iprp_srcost.2da |
Source of what is referenced by the game engine (not complete - some 2da files seem to be loaded from elsewhere such as swear filters). It relates to this file: https://github.com/nwnxee/unified/blob/master/NWNXLib/API/API/CTwoDimArrays.hpp
|