PRC8/nwn/nwnprc/trunk/scripts/prc_dreadnecro.nss

105 lines
3.4 KiB
Plaintext
Raw Normal View History

// Dread Necromancer passive abilities.
#include "prc_inc_template"
void DNDamageResist(object oPC, int nLevel)
{
object oSkin = GetPCSkin(oPC);
if(GetLocalInt(oSkin, "DNDamageResist") == TRUE) return;
int nDR;
if (nLevel >= 15) nDR = IP_CONST_DAMAGERESIST_8;
else if (nLevel >= 11) nDR = IP_CONST_DAMAGERESIST_6;
else if (nLevel >= 7) nDR = IP_CONST_DAMAGERESIST_4;
else if (nLevel >= 2) nDR = IP_CONST_DAMAGERESIST_2;
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_PIERCING, nDR), oSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_SLASHING, nDR), oSkin);
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_BLUDGEONING, nDR), oSkin);
SetLocalInt(oSkin, "DNDamageResist", TRUE);
}
// Armour Spell Fail reduction
/*void ReducedASF(object oCreature)
{
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature);
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature);
object oSkin = GetPCSkin(oCreature);
int nAC = GetBaseAC(oArmor);
int nClass = GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oCreature);
int iBonus = GetLocalInt(oSkin, "DreadNecroArmour");
int nASF = -1;
itemproperty ip;
// First thing is to remove old ASF (in case armor is changed.)
if (iBonus != -1)
RemoveSpecificProperty(oSkin, ITEM_PROPERTY_ARCANE_SPELL_FAILURE, -1, iBonus, 1, "DreadNecroArmour");
// As long as they meet the requirements, just give em max ASF reduction
// I know it could cause problems if they have increased ASF, but thats unlikely
else if (3 >= nAC)
nASF = IP_CONST_ARCANE_SPELL_FAILURE_MINUS_25_PERCENT;
// Apply the ASF to the skin.
ip = ItemPropertyArcaneSpellFailure(nASF);
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oSkin);
SetLocalInt(oSkin, "DreadNecroArmour", nASF);
}*/
void main()
{
//Declare main variables.
int nEvent = GetRunningEvent();
object oPC;
switch(nEvent)
{
case EVENT_ITEM_ONHIT: oPC = OBJECT_SELF; break;
case EVENT_ONPLAYEREQUIPITEM: oPC = GetItemLastEquippedBy(); break;
case EVENT_ONPLAYERUNEQUIPITEM: oPC = GetItemLastUnequippedBy(); break;
case EVENT_ONHEARTBEAT: oPC = OBJECT_SELF; break;
default:
oPC = OBJECT_SELF;
}
int nClass = GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oPC);
if(nEvent == EVENT_ONHEARTBEAT)
{
if (nClass > 16)
{
int bFortification = GetLocalInt(oPC, "MEDIUM_FORTIFCATION_ACTIVE");
if (!bFortification)
{
DoFortification(oPC, FORTIFICATION_MEDIUM);
SetLocalInt(oPC, "MEDIUM_FORTIFCATION_ACTIVE", 1);
if(DEBUG) DoDebug("prc_dreadnecro >> DoFortification() activated.");
}
}
else if (nClass > 9)
{
int bFortification = GetLocalInt(oPC, "LIGHT_FORTIFCATION_ACTIVE");
if (!bFortification)
{
DoFortification(oPC, FORTIFICATION_LIGHT);
SetLocalInt(oPC, "LIGHT_FORTIFCATION_ACTIVE", 1);
if(DEBUG) DoDebug("prc_dreadnecro >> DoFortification() activated.");
}
}
}
else if(nEvent == FALSE)
{
//if (GetIsPC(oPC)) ReducedASF(oPC);
if(nClass > 1) DNDamageResist(oPC, nClass);
if(nClass > 19) ApplyTemplateToObject(TEMPLATE_LICH, oPC);
AddEventScript(oPC, EVENT_ONHEARTBEAT, "prc_dreadnecro", TRUE, FALSE);
}
}