cls_pres_xxx.2da are deceptively named 2da files that usually are used for the the PreReqTable in classes.2da. In fact it can be also applied to base classes - although not all the requirement may work (since of course at level 0 you don't have any skills or other levels to check).

Also remember there is an existing "AlignRestrict" column in classes.2da to restrict alignments.

2da Columns

Each row defines one requirement. Some requirements are "OR" and some are "AND" see Requirements List below.

ColumnExampleValid ValuesDescription and Notes
LABELScriptVarTextHuman readable label












A set requirement type, see the Requirements List below
ReqParam1X1_AllowDwDefSee requirements listFirst parameter
ReqParam20See requirements listSecond parameter

Requirements List

Each different requirement type needs to be met, but some of them as noted allow more than one usage to have any of the given singular requirement met (usually marked with OR in the type name)

It needs testing if the order of these rows matters, since it likely reads them top to bottom so a "CLASSNOT" may need to go near the bottom since it's a negative requirement, same with "VAR".

ReqTypeWorks with base classParameters InfoExample UsageNotes
ARCSPELLLikely no (needs testing)ReqParam1 is the required combined class levels which are arcane spellcasters  - ie is a spellcaster and has Arcane set to 1 in classes.2da

cls_pres_palem.2da, value 3

This requires one class to be of this level of higher. For instance setting it to 10 makes a Wizard 5 / Bard 5 fail but a Wizard 10 pass the requirement.

There is no equivalent for "Divine spellcasting levels" although you could possibly fake this with CLASSOR/CLASSNOT and SPELL

BABLikely no (needs testing)ReqParam1 is the required base attack bonus, eg; Level 5 fighter will have 5 BAB, while a Level 5 Wizard has 2, while a Fighter 5 / Wizard 5 has 7cls_pres_blkgrd.2da, value 6The combined BAB counts as per the example
CLASSORLikely no (needs testing)ReqParam1 is the row number of a required class in classes.2da. Meeting any of the CLASSOR prerequisites counts as meeting them all.cls_pres_dradis.2da, value 1 and 9 (Bard or Sorcerer)
CLASSNOTLikely no (needs testing)ReqParam1 is the row number of a prohibited class in classes.2da.Not used in any default 2da

You can combine this with the CLASSOR to potentially have it reject certain combinations most likely. Needs further testing.

FEATLikely no (needs testing)ReqParam1 is the row number of a required feat in feat.2da.cls_pres_harper, 0 and 22 (Alertness and Iron Will)Each of these must be valid.
FEATORLikely no (needs testing)ReqParam1 is the row number of a required feat in feat.2da. Meeting any of the FEATOR prerequisites counts as meeting them all.cls_pres_archer.2da, value 101 and 102 (Weapon Focus Longbow or Shortbow)Alas you can't specify, for instance, one set of feats and a second set of feats that must be valid.
RACEYesReqParam1 is the row number of a permitted racial type in racialtypes.2da. Meeting any of the RACE prerequisites counts as meeting them all.cls_pres_archer.2da, value 1 and 4 (Elf or Half-Elf)Since the race is selected before class this means a base class can be restricted to a specific set of races.
SAVELikely no (needs testing)ReqParam1 indicates the type of save (1 for fortitude, 2 for reflex, or 3 for will), and ReqParam2 is the required saving throw bonus (without magical modifiers).Not used in any default 2daThis is an odd requirement, saving throw totals are across classes though.
SKILLLikely no (needs testing)ReqParam1 is the row number of a required skill in skills.2da, and ReqParam2 is the required number of ranks in that skill.cls_pres_asasin.2da, value 8 / 8 (Move Silently, 8 ranks) and 5 / 8 (Hide, 8 ranks)This is the base ranks, not with modifiers. Note NWN has the abusable "feature" that allows skill points to be "saved" across levels and spent all at once, making it trivial to get around this in some cases - excepting the usual limit of class level + 3 for the rank itself.
SPELLLikely no (needs testing)ReqParam1 is the required class level of a spellcasting class.cls_pres_shiftr.2da, value 3

Combined levels do not count, eg: Sorcerer 5 / Bard 5 is only 5 for this parameter.

Note since you can't test for certain spell casting levels, Paladins, Bards and Rangers tend to make this requirement earlier than they can perhaps cast spells (although in most cases this won't matter - at least in the base game Shifter is the only one that uses it and has feats as another requirement)

VARMaybe yes (needs testing)ReqParam1 is the name of a local variable that will be checked that is set on the player object at the time, and ReqParam2 is the integer value this variable must have.cls_pres_divcha.2da, value X2_AllowDivcha

This is an interesting one; if you set the ReqParama2 to be 0 then the variable must be there to disable it, while if you use say a value of 1 then the variable must be set.

You can use this to either block a certain class in a module or have one that is unlocked later (similar to how NWN2 got "Neverwinter Nine" prestige class purely unlocked through quests).

This might well work for base classes that you don't want at level 1. EG: Perhaps you only allow "Commoner" for level 1 and then can multiclass to any other class once you complete some kind of training academy.

NWNX may be able to set a variable before character generation is chosen as well for MP and SP modules might be able to as well but needs further testing.

Note: the default prestige class 2da files name the variables "Allow" when in fact they are "Deny" if set. The wrong way around!

2da Contents

Example contents from cls_pres_dwdef.2da:

2DA V2.0                                                        
           LABEL         ReqType   ReqParam1        ReqParam2   
0          Dwarf         RACE      0                ****     
1          Dodge         FEAT      10               ****        
2          Toughness     FEAT      40               ****        
3          Base_Attack   BAB       7                ****        
4          ScriptVar     VAR       X1_AllowDwDef    0           
  • No labels