The Enhanced Edition offers a limited workaround via scripting thanks to some new functions.
Keep in mind that this won’t replicate the baseline weapon finesse mechanics 100%, what it will do is grant an attack bonus if you are wearing specific non finessable weapons that you want to be finessable instead.
To make it clear how this will work:
The bonus will applied when:
- You wield the custom finessable weapon in right hand and nothing in left hand.
- You wield the custom finessable weapon in right hand and shield or torch in left hand.
- You wield two custom finessable weapons.
Any other combination will prevent the bonus fire.
First you make an include script called “custom_finesse” save it, but do not compile or it will give a warning message. Instructions on how to add more weapons are in the comments inside, in this I simply added the Katana to the list of finessable weapons.
#include "nw_i0_spells"
int GetIsCustomFinessableWeapon(object oWEAPON)
{
int nWEAPON = GetBaseItemType(oWEAPON);
switch (nWEAPON)
{
case BASE_ITEM_SMALLSHIELD:
case BASE_ITEM_LARGESHIELD:
case BASE_ITEM_TOWERSHIELD:
case BASE_ITEM_TORCH:
// Add whatever non finessable weapon you want to convert here
// Do not delete the shields and the torch above.
// In this example I add the katana, but you can change it or add more.
// Do not add weapons that are already finessable or they will get double bonus.
case BASE_ITEM_KATANA:
return TRUE;
}
return FALSE;
}
void RemoveCustomFinesse(object oPC)
{
effect eFX = GetFirstEffect(oPC);
while (GetIsEffectValid(eFX) == TRUE)
{
if (GetEffectTag(eFX) == "CUSTOM_FINESSE")
{
RemoveEffect(oPC, eFX);
}
eFX = GetNextEffect(oPC);
}
}
void ApplyCustomFinesse(object oPC)
{
if (GetHasFeat(FEAT_WEAPON_FINESSE, oPC) == FALSE) return;
int nDEX = GetAbilityModifier(ABILITY_DEXTERITY, oPC);
int nSTR = GetAbilityModifier(ABILITY_STRENGTH, oPC);
if (nDEX <= nSTR ) return;
object oRIGHT = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
if (GetWeaponRanged(oRIGHT) == TRUE) return;
if (GetIsCustomFinessableWeapon(oRIGHT) == FALSE) return;
object oLEFT = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
if (oLEFT != OBJECT_INVALID)
{
if (GetIsCustomFinessableWeapon(oLEFT) == FALSE) return;
}
effect eFX = EffectAttackIncrease(nDEX - nSTR);
eFX = SupernaturalEffect(eFX);
eFX = TagEffect(eFX, "CUSTOM_FINESSE");
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eFX, oPC);
}
When you’ve done this, you must open the scripts used by module properties to handle the Equip and Unequip events and include the above scripts and call the two void functions properly, along with the increase to the maximum attack bonus limit allowed by the engine (if capped to 20, as default, this will become prolematic as the finesse will stop working).
This is how it was implemented in the “x2_mod_def_equ” stock script (some parts were excluded here)
....
#include "x2_inc_switches"
#include "x2_inc_intweapon"
#include "x3_inc_horse"
#include "custom_finesse"
void main()
{
object oItem = GetPCItemLastEquipped();
object oPC = GetPCItemLastEquippedBy();
SetAttackBonusLimit(255);
RemoveCustomFinesse(oPC);
DelayCommand(0.0f, ApplyCustomFinesse(oPC));
....
The same has to be done for the script that handles the Unequip Event (the opposite in this case would be “x2_mod_def_unequ”.
Keep in mind that the original campaigns do not use those scripts to handle the equipment events, these are mostly for the new player made custom modules, to change the event script in-game you will need to make another specific script and run it via a console command. (if you need more info on this I can provide it later)
It’s a long road to get there, but hopefully this helped a bit.