PRC8/nwn/nwnprc/trunk/scripts/wol_m_blackrzr.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

216 lines
9.2 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name Blackrazor maintain script
//:: FileName wol_m_blackrzr
//:://////////////////////////////////////////////
/*
LEGACY ITEM PENALTIES (These do not stack. Highest takes precedence).
Attack Penalty: -1 at 6th, -2 at 12th, -3 at 18th
Fort Save Penalty: -1 at 7th, -2 at 9th, -3 at 15th, -4 at 20th
Hit Point Penalty: -2 at 7th, -4 at 8th, -6 at 10th, -8 at 14th, -10 at 16th
LEGACY ITEM BONUSES
7th - +2 Greatsword
12th - +3 Greatsword
18th - +3 Vicious Greatsword
20th - +5 Vicious Greatsword
LEGACY ITEM ABILITIES
Mental Ward (Su): While wielding Blackrazor, you gain a bonus on saving throws against mind-affecting effects. When you attain 6th level, this bonus is +1, but it improves to +3 at 14th level and to +5 at 19th level.
Detect Life (Sp): Beginning at 9th level, three times per day, you can detect life. Caster level 5th.
Souldrinking (Sp): Beginning at 10th level, once per day, you can cast Death Knell. At 13th level, you can cast it three times per day. At 17th level, unlimited times per day. Caster level equals hit dice.
Haste (Sp): Beginning at 16th level, once per day, you can cast Haste. Caster level 10th.
*/
#include "prc_inc_template"
void main()
{
int nEvent = GetRunningEvent();
if(DEBUG) DoDebug("wol_m_blackrzr running, event: " + IntToString(nEvent));
// Get the PC. This is event-dependent
object oPC, oItem;
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;
}
object oSkin = GetPCSkin(oPC);
int nHD = GetHitDice(oPC);
int nHPPen = 0;
object oWOL = GetItemPossessedBy(oPC, "WOL_Blackrazor");
// You get nothing if you aren't wielding the weapon
if(oWOL != GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC))
{
SetCompositeAttackBonus(oPC, "Blackrazor_Atk", 0, ATTACK_BONUS_MISC);
SetCompositeBonus(oSkin, "Blackrazor_Saves", 0, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_MINDAFFECTING);
SetCompositeBonus(oSkin, "Blackrazor_SavesR", 0, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_FORTITUDE);
return;
}
// We aren't being called from any event, instead from EvalPRCFeats
if(nEvent == FALSE)
{
// 5th to 10th level abilities
if (GetHasFeat(FEAT_LEAST_LEGACY, oPC))
{
if(nHD >= 5)
{
}
if(nHD >= 6)
{
nHPPen += 2;
SetCompositeAttackBonus(oPC, "Blackrazor_Atk", -1, ATTACK_BONUS_MISC);
SetCompositeBonus(oSkin, "Blackrazor_Saves", 1, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_MINDAFFECTING);
}
if(nHD >= 7)
{
nHPPen += 2;
SetCompositeBonus(oSkin, "Blackrazor_SavesR", 1, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_FORTITUDE);
}
if(nHD >= 8)
{
nHPPen += 2;
}
if(nHD >= 9)
{
SetCompositeBonus(oSkin, "Blackrazor_SavesR", 2, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_FORTITUDE);
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_BLACKRAZOR_DETECT), 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}
if(nHD >= 10)
{
nHPPen += 2;
IPSafeAddItemProperty(oWOL, ItemPropertyEnhancementBonus(2));
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_BLACKRAZOR_KNELL), 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}
}
// 11th to 16th level abilities
if (GetHasFeat(FEAT_LESSER_LEGACY, oPC))
{
if(nHD >= 11)
{
}
if(nHD >= 12)
{
SetCompositeAttackBonus(oPC, "Blackrazor_Atk", -2, ATTACK_BONUS_MISC);
IPSafeAddItemProperty(oWOL, ItemPropertyEnhancementBonus(3));
}
if(nHD >= 13)
{
}
if(nHD >= 14)
{
nHPPen += 2;
SetCompositeBonus(oSkin, "Blackrazor_Saves", 2, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_MINDAFFECTING);
}
if(nHD >= 15)
{
SetCompositeBonus(oSkin, "Blackrazor_SavesR", 3, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_FORTITUDE);
}
if(nHD >= 16)
{
nHPPen += 2;
IPSafeAddItemProperty(oSkin, PRCItemPropertyBonusFeat(IP_CONST_FEAT_BLACKRAZOR_HASTE), 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}
}
// 17th+ level abilities
if (GetHasFeat(FEAT_GREATER_LEGACY, oPC))
{
if(nHD >= 17)
{
}
if(nHD >= 18)
{
SetCompositeAttackBonus(oPC, "Blackrazor_Atk", -3, ATTACK_BONUS_MISC);
if(DEBUG) DoDebug("wol_m_blackrzr: Adding eventhooks");
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, "wol_m_blackrzr", TRUE, FALSE);
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, "wol_m_blackrzr", TRUE, FALSE);
AddEventScript(oWOL, EVENT_ITEM_ONHIT, "wol_m_blackrzr", TRUE, FALSE);
// Add the OnHitCastSpell: Unique needed to trigger the event
IPSafeAddItemProperty(oWOL, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}
if(nHD >= 19)
{
SetCompositeBonus(oSkin, "Blackrazor_Saves", 3, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC, IP_CONST_SAVEVS_MINDAFFECTING);
}
if(nHD >= 20)
{
SetCompositeBonus(oSkin, "Blackrazor_SavesR", 4, ITEM_PROPERTY_DECREASED_SAVING_THROWS, IP_CONST_SAVEBASETYPE_FORTITUDE);
IPSafeAddItemProperty(oWOL, ItemPropertyEnhancementBonus(5));
}
}
SetLocalInt(oPC, "WoLHealthPenalty", nHPPen);
if (!GetLocalInt(oPC, "WoLHealthPenaltyHB") && nHPPen > 0)
{
WoLHealthPenaltyHB(oPC);
SetLocalInt(oPC, "WoLHealthPenaltyHB", TRUE);
}
}
// We are called from the OnPlayerEquipItem eventhook. Add OnHitCast: Unique Power to oPC's weapon
else if(nEvent == EVENT_ONPLAYEREQUIPITEM)
{
oPC = GetItemLastEquippedBy();
oItem = GetItemLastEquipped();
if(DEBUG) DoDebug("wol_m_blackrzr - OnEquip\n"
+ "oPC = " + DebugObject2Str(oPC) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
);
if(oItem == oWOL)
{
// Add eventhook to the item
AddEventScript(oItem, EVENT_ITEM_ONHIT, "wol_m_blackrzr", TRUE, FALSE);
// Add the OnHitCastSpell: Unique needed to trigger the event
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}
}
// We are called from the OnPlayerUnEquipItem eventhook. Remove OnHitCast: Unique Power from oPC's weapon
else if(nEvent == EVENT_ONPLAYERUNEQUIPITEM)
{
oPC = GetItemLastUnequippedBy();
oItem = GetItemLastUnequipped();
if(DEBUG) DoDebug("wol_m_blackrzr - OnUnEquip\n"
+ "oPC = " + DebugObject2Str(oPC) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
);
// Only applies to the WoL
if(GetBaseItemType(oItem) == BASE_ITEM_GREATSWORD)
{
// Add eventhook to the item
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "wol_m_blackrzr", TRUE, FALSE);
// Remove the temporary OnHitCastSpell: Unique
// Makes sure to get ammo if its a ranged weapon
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
}
}
else if(nEvent == EVENT_ITEM_ONHIT)
{
oItem = GetSpellCastItem();
object oTarget = PRCGetSpellTargetObject();
if(DEBUG) DoDebug("wol_m_blackrzr: OnHit:\n"
+ "oPC = " + DebugObject2Str(oPC) + "\n"
+ "oItem = " + DebugObject2Str(oItem) + "\n"
+ "oTarget = " + DebugObject2Str(oTarget) + "\n"
);
// Was it Blackrazor
if(oItem == oWOL)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(d6(), DAMAGE_TYPE_POSITIVE), oPC);
}// end if - Item is a melee weapon
}// end if - Running OnHit event
}