PRC8/nwn/nwnprc/trunk/scripts/prc_bladesinger.nss
Jaysyn904 0f43e5cbd2 2025-04-15 Update
Added Elven blades to Weaponmaster prereqs
Fixed Beckon the Frozen
Fixed bug with Fire Brand
Fixed duration bug with Improved Invisibility
Added Soul Eater to Shifter prereqs
Fixed ability based class prereqs in prc_prereq.nss
Update Eye of Gruumsh for epic levels
Update Ur-Priest for epic levels
Update Forsaker for epic levels
Update Anima Mage for epic levels
Update Serene Guardian for epic levels
Bladesinger abilities can use chain shirts
Fixed Elemental Abjuration
Fixed bug with prc cache creature.
Forsakers can use non-magic items (heal kits, alchemy, etc)
Updated ruleset.2da for NWNEE update
Updated AotS bonus feats

-Notes
Added 3.5e Template index
Added 3.5e update booklet

Removed release archive
2025-04-15 18:10:14 -04:00

172 lines
5.3 KiB
Plaintext

#include "prc_class_const"
#include "prc_feat_const"
#include "prc_spell_const"
#include "inc_item_props"
//#include "prc_misc_const"
#include "inc_utility"
int GetIsBladesongWeapon(object oWeapon)
{
if(!GetIsObjectValid(oWeapon))
return FALSE;
int nType = GetBaseItemType(oWeapon);
return nType == BASE_ITEM_RAPIER
|| nType == BASE_ITEM_LONGSWORD
|| nType == BASE_ITEM_ELVEN_LIGHTBLADE
|| nType == BASE_ITEM_ELVEN_THINBLADE;
}
void RemoveSpellEffectSong(object oPC)
{
effect eff = GetFirstEffect(oPC);
while(GetIsEffectValid(eff))
{
if(GetEffectSpellId(eff) == SPELL_SONG_OF_FURY)
RemoveEffect(oPC, eff);
eff = GetNextEffect(oPC);
}
}
void OnEquip(object oPC,object oSkin)
{
object oChest = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC);
int nBaseAC = GetBaseAC(oChest);
int nWeight = GetWeight(oChest);
//:: 1 longsword/rapier & light armour
if (!GetIsBladesongWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC))
|| GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC))
|| (nBaseAC > 3 && !(nBaseAC == 4 && nWeight < 160)))
{
if (GetHasFeatEffect(FEAT_SONG_OF_FURY, oPC))
RemoveSpellEffectSong(oPC);
SetCompositeBonus(oSkin, "BladesAC", 0, ITEM_PROPERTY_AC_BONUS);
SetCompositeBonus(oSkin, "BladesCon", 0, ITEM_PROPERTY_SKILL_BONUS, SKILL_CONCENTRATION);
return;
}
//:: Bonus Lvl BladeSinger Max Bonus Int
int BladeLv = PRCMin(GetLevelByClass(CLASS_TYPE_BLADESINGER, oPC), GetAbilityModifier(ABILITY_INTELLIGENCE, oPC));
SetCompositeBonus(oSkin, "BladesAC", BladeLv, ITEM_PROPERTY_AC_BONUS);
if (GetHasFeat(FEAT_LESSER_SPELLSONG, oPC))
SetCompositeBonus(oSkin, "BladesCon", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_CONCENTRATION);
}
/* void OnEquip(object oPC,object oSkin)
{
// 1 longsword/rapier & light armour
if(!GetIsBladesongWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC))
|| GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC))
//:: Handles Mithral Chain Shirt
|| GetBaseAC(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC)) > 3 || GetBaseAC(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC)) == 4 && GetWeight(GetItemInSlot(INVENTORY_SLOT_CHEST)) < 160)
{
if(GetHasFeatEffect(FEAT_SONG_OF_FURY, oPC))
RemoveSpellEffectSong(oPC);
SetCompositeBonus(oSkin, "BladesAC", 0, ITEM_PROPERTY_AC_BONUS);
SetCompositeBonus(oSkin, "BladesCon", 0, ITEM_PROPERTY_SKILL_BONUS,SKILL_CONCENTRATION);
return;
}
// Bonus Lvl BladeSinger Max Bonus Int
int BladeLv = PRCMin(GetLevelByClass(CLASS_TYPE_BLADESINGER, oPC), GetAbilityModifier(ABILITY_INTELLIGENCE,oPC));
SetCompositeBonus(oSkin, "BladesAC", BladeLv, ITEM_PROPERTY_AC_BONUS);
if(GetHasFeat(FEAT_LESSER_SPELLSONG,oPC))
SetCompositeBonus(oSkin, "BladesCon", 5, ITEM_PROPERTY_SKILL_BONUS, SKILL_CONCENTRATION);
} */
void OnUnEquip(object oPC,object oSkin)
{
object oItem=GetItemLastUnequipped();
object oArmor=GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
object oWeapL=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
object oWeapR=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
if (GetBaseAC(oArmor)>3)
{
if (GetHasFeatEffect(FEAT_SONG_OF_FURY,oPC))
{
RemoveSpellEffectSong(oPC);
}
SetCompositeBonus(oSkin, "BladesAC", 0, ITEM_PROPERTY_AC_BONUS);
SetCompositeBonus(oSkin, "BladesCon", 0, ITEM_PROPERTY_SKILL_BONUS,SKILL_CONCENTRATION);
return;
}
if (
(GetIsObjectValid(oWeapL) && GetIsObjectValid(oWeapR) ) ||
(!GetIsObjectValid(oWeapL) && !GetIsObjectValid(oWeapR) )
)
{
if (GetHasFeatEffect(FEAT_SONG_OF_FURY,oPC))
{
RemoveSpellEffectSong(oPC);
}
SetCompositeBonus(oSkin, "BladesAC", 0, ITEM_PROPERTY_AC_BONUS);
SetCompositeBonus(oSkin, "BladesCon", 0, ITEM_PROPERTY_SKILL_BONUS,SKILL_CONCENTRATION);
return;
}
if (!(GetBaseItemType(oWeapL)==BASE_ITEM_RAPIER ||
GetBaseItemType(oWeapR)==BASE_ITEM_RAPIER ||
GetBaseItemType(oWeapL)==BASE_ITEM_ELVEN_THINBLADE ||
GetBaseItemType(oWeapR)==BASE_ITEM_ELVEN_THINBLADE ||
GetBaseItemType(oWeapL)==BASE_ITEM_ELVEN_LIGHTBLADE ||
GetBaseItemType(oWeapR)==BASE_ITEM_ELVEN_LIGHTBLADE ||
GetBaseItemType(oWeapL)==BASE_ITEM_LONGSWORD ||
GetBaseItemType(oWeapR)==BASE_ITEM_LONGSWORD) )
{
if (GetHasFeatEffect(FEAT_SONG_OF_FURY,oPC))
{
RemoveSpellEffectSong(oPC);
}
SetCompositeBonus(oSkin, "BladesAC", 0, ITEM_PROPERTY_AC_BONUS);
SetCompositeBonus(oSkin, "BladesCon", 0, ITEM_PROPERTY_SKILL_BONUS,SKILL_CONCENTRATION);
return;
}
int BladeLv=GetLevelByClass(CLASS_TYPE_BLADESINGER,oPC);
int Intb=GetAbilityModifier(ABILITY_INTELLIGENCE,oPC);
if ( BladeLv>Intb)
BladeLv=Intb;
SetCompositeBonus(oSkin, "BladesAC", BladeLv, ITEM_PROPERTY_AC_BONUS);
if ( GetHasFeat(FEAT_LESSER_SPELLSONG,oPC))
SetCompositeBonus(oSkin, "BladesCon", 5, ITEM_PROPERTY_SKILL_BONUS,SKILL_CONCENTRATION);
}
void main()
{
//Declare main variables.
object oPC = OBJECT_SELF;
object oSkin = GetPCSkin(oPC);
OnEquip(oPC,oSkin);
//int iEquip = GetLocalInt(oPC,"ONEQUIP");
// if (iEquip !=1) OnEquip(oPC,oSkin);
// if (iEquip ==1) OnUnEquip(oPC,oSkin);
}