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.
Column | Example | Valid Values | Description and Notes |
---|---|---|---|
LABEL | ScriptVar | Text | Human readable label |
ReqType | VAR | ARCSPELL BAB CLASSOR CLASSNOT FEAT FEATOR RACE SAVE SKILL SPELL VAR | A set requirement type, see the Requirements List below |
ReqParam1 | X1_AllowDwDef | See requirements list | First parameter |
ReqParam2 | 0 | See requirements list | Second 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".
ReqType | Works with base class | Parameters Info | Example Usage | Notes |
---|---|---|---|---|
ARCSPELL | Likely 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 |
BAB | Likely 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 7 | cls_pres_blkgrd.2da, value 6 | The combined BAB counts as per the example |
CLASSOR | Likely 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) | |
CLASSNOT | Likely 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. |
FEAT | Likely 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. |
FEATOR | Likely 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. |
RACE | Yes | ReqParam1 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. |
SAVE | Likely 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 2da | This is an odd requirement, saving throw totals are across classes though. |
SKILL | Likely 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. |
SPELL | Likely 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) |
VAR | Maybe 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