I've added some tweaks and patches to the server so that shield, armour and weapon proficiencies are handled as they are written in the 3.5 SRD (or Pathfinder, where it makes sense).
Proficiencies
Armour and shield proficiencies have been softened; meaning anyone can equip any defensive gear now. Doing so with things you have no proficiency for (as in, the feats) with will apply the penalties transparently that one would expeect:
A character who is wearing armor with which she is not proficient applies its armor check penalty to attack rolls and to all skill checks that involve moving, including Ride.
When you are using a shield with which you are not proficient, you take the shield’s armor check penalty on attack rolls and on all skill checks that involve moving, including Ride checks.
Haha-sidenote: Funnily enough, hooking CNWSCreatureStats::GetSkillRank(*this, uint8 skill, *versus, bool a3)
, completely ignoring a3, and expecting everything to go smoothly was a bit naive in hindsight. Turns out that is actually ranks_only
just like the script call advertises, and the Save-to-servervault method actually calls this too .. Oh well, restore from backup .. When called with false it actually returns all the feat-modifiers and properties anyways, so might as well inject myself there and no harm was done.
As well, wielding a tower shield will provide you with a fancy -2 penalty on AB; which is something NWN did not do before. A very minor issue.
The same goes for weapons you are not versed with; however, here the penalty is a tough -4 to AB:
When using a weapon with which you are not proficient, you take a –4 penalty on attack rolls.
Right now, that penalty applies whenever you wield a weapon you are a noob with; no matter if offhand or mainhand (but only once, you know where to send the money!). Not too sure what to do about that, since AB would have to be hooked separately for each hand I think, and I didn't find the right place. I suspect it doesn't actually exist, and I furthermore suspect it doesn't actually matter in real-life. Might be better off if I had chosen to use engine effects, but that would have been cludgy at best. Right now I'm feeling pretty good just ignoring it!
duplicates some fields provides data to all provides data to some AI-related methods makes a copy for sending to clients does magic, and once that was hooked just so (AB 180/175/170/165 sounds about right, right? Right?) it worked. I'm pretty sure the whole thing breaks if a DM does #set bab something something but don't tell anyone. The worst part was actually finding the places where the UI is updated (you know, the charsheet!). Turns out, there is some mysterious method pair CNWSCreatureStats::UpdateCombatInformation and CNWSCreatureStats::UpdateLastStatsObject that
Special Attacks
Special attacks are all attacks that are inserted into the combat round - like TripKnockdown, Disarm, Stunning Fist, Critical Strike, and so on. I've hooked those as well, so that one can run arbitary effects instead of the hardcoded ones. Right now, the only fix applied is to reduce stun duration for Stunning Fist to one round (was three!), and completely disable Disarm and TripKnockdown, because frankly they suck donkey. There was talk about reworking all those feats into PW-compatible Combat Maneuvers inspired by Pathfinder. Real Soon Now.
Bards
In the same vein, I've deleted the shoddy scripts that used to apply a -20% ASF on light armour worn by bards, and made it into a core override instead to GetASF (actually, I am mid-method hooking Get2DAFloat inside of CNWSCreature::ComputeArmourClass (sic), but who cares about that, right?). So yeah, this is now handled natively as well, making it much more robust (and transparent) to the user. Someone just needs to go and edit the TLK entries for light armour to show that fact to attentive readers.
In any case, This is in line with our aim in getting rid of all the NWN-isms that don't make much sense in a persistent world setting.
Witch Casterlevels
The Witch PRC outlined (okay, it was more than an outline I guess!) in a previous blahg post required some intrinsic tweaks, so that the taken Witch class levels are added onto the Druid class levels for the purpose of spell CL/DC calculation. That has been done as well, and should work transparently with no script-side monkeypatching required. The same mechanism can be used to augment any non-spellbook caster PRC to provide full CL progression for it's base classes, but for now, it's just the Witch. Drawback right now is that it only makes sense build on the Druid class; and a multiclass character cannot pick onto which base class the Witch should gloop on.
Technical Background
All of this code goes into a custom NWNX plugin that will eventually be published for other PWs. Goal is to provide a drop-in plugin that just 3.5ifies your server, with no scripting necessary. The actual code is in our silm-specific NWNX plugin (and 3.5ify-plugin here), and will eventually be bumped onto Github as well (another long-waiting thing to be pushed is nwnx_redis ..). So that this doesn't conflict with other plugins that might conceivably hook these methods (although I can't think of one offhand!), I might have to introduce some new core events in nwnx2. We'll see.
Pointy thing
). Better not mess with that one!
Also, I made a new rapier, in the style of older sideswords (or so I've been told). Design target was a character of mine, aiming for a really elegant-but-sinister look, but I suppose it would look just as fierce in the hands of a drow (although it might be too big for them