PRC8/nwn/nwnprc/trunk/scripts/prc_unequip.nss
Jaysyn904 2223aa463d Bringing PRC Alpha up to pairty with PRC35
Bringing PRC alpha up to parity with PRC35 with the exception of the marker feats, which need to be reworked.  Updated PRC alpha release.
2024-01-02 20:03:30 -05:00

184 lines
7.0 KiB
Plaintext

//::///////////////////////////////////////////////
//:: PRC OnItemUnequipped
//:: prc_unequip
//:: (c) 2003 Bioware Corp.
//:://////////////////////////////////////////////
/*
Put into: OnUnEquip Event
*/
//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: 2003-07-16
//:://////////////////////////////////////////////
#include "prc_inc_function"
#include "inc_timestop"
#include "prc_inc_itmrstr"
#include "prc_inc_combat"
#include "prc_inc_template"
void PrcFeats(object oPC, object oItem)
{
SetLocalInt(oPC,"ONEQUIP",1);
EvalPRCFeats(oPC);
//this is to remove effect-related itemproperties
//in here to take advantage of the local
//I didnt put it in EvalPRCfeats cos I cant be bothered to wait for the compile
//Ill probably move it at some point, dont worry
//Primogenitor
CheckPRCLimitations(oItem, oPC);
DeleteLocalInt(oPC,"ONEQUIP");
}
void DoNaturalWeaponEffect(object oPC)
{
if (DEBUG) DoDebug("GetIsUsingPrimaryNaturalWeapons "+IntToString(GetIsUsingPrimaryNaturalWeapons(oPC))+" PrimaryNaturalWeapEffect "+IntToString(GetLocalInt(oPC, "PrimaryNaturalWeapEffect")));
if (GetIsUsingPrimaryNaturalWeapons(oPC) && GetLocalInt(oPC, "PrimaryNaturalWeapEffect"))
{
SetPrimaryNaturalWeaponAttacks(oPC, 0);
DeleteLocalInt(oPC, "PrimaryNaturalWeapEffect");
}
}
void DoWeaponUnequip(object oPC, object oItem);
//Added hook into EvalPRCFeats event
// Aaon Graywolf - 6 Jan 2004
//Added delay to EvalPRCFeats event to allow module setup to take priority
// Aaon Graywolf - Jan 6, 2004
void main()
{
object oItem = GetItemLastUnequipped();
object oPC = GetItemLastUnequippedBy();
//if(DEBUG) DoDebug("Running OnUnEquip, creature = '" + GetName(oPC) + "' is PC: " + DebugBool2String(GetIsPC(oPC)) + "; Item = '" + GetName(oItem) + "' - '" + GetTag(oItem) + "'");
DoTimestopUnEquip(oPC, oItem);
if (GetResRef(oItem) == "prc_crown_might") DestroyObject(oItem);
if (GetResRef(oItem) == "prc_crown_prot") DestroyObject(oItem);
// Delay a bit to prevent TMI due to polymorph effect being braindead and running the unequip script for each and
// bloody every item the character has equipped at the moment of effect application. Without detaching the script
// executions from the script that does the effect application. So no instruction counter resets.
// This will probably smash some scripts to pieces, at least when multiple unequips happen at once. Hatemail
// to nwbugs@bioware.com please.
DelayCommand(0.0f, PrcFeats(oPC, oItem));
/* Does not seem to work, the effect is not listed yet when the unequip scripts get run
if(PRCGetHasEffect(EFFECT_TYPE_POLYMORPH, oPC))
{
DoDebug("prc_unequip: delayed call");
DelayCommand(0.0f, PrcFeats(oPC));
}
else
{
DoDebug("prc_unequip: direct call");
PrcFeats(oPC);
}*/
DoWeaponUnequip(oPC, oItem);
// No weapons equipped, restore
DelayCommand(0.15, DoNaturalWeaponEffect(oPC));
//:: Saint / Holy Touch doesn't work w/ ranged weapons
if (GetHasTemplate(TEMPLATE_SAINT, oPC))
{
//:: Setup Holy Touch extra damage vs evil
effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(7, DAMAGE_TYPE_DIVINE), 0, ALIGNMENT_EVIL);
effect eEffect2 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_DIVINE), 0, ALIGNMENT_EVIL);
eEffect2 = VersusRacialTypeEffect(eEffect2, RACIAL_TYPE_OUTSIDER);
effect eEffect3 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_DIVINE), 0, ALIGNMENT_EVIL);
eEffect3 = VersusRacialTypeEffect(eEffect3, RACIAL_TYPE_UNDEAD);
effect eLink = EffectLinkEffects(eEffect1, eEffect2);
eLink = EffectLinkEffects(eLink, eEffect3);
eLink = SupernaturalEffect(eLink);
eLink = TagEffect(eLink, "EffectHolyTouch");
//:: Clear the effect to be safe and prevent stacking
effect eCheckEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eCheckEffect))
{
if (GetEffectTag(eCheckEffect) == "EffectHolyTouch")
{
RemoveEffect(oPC, eCheckEffect);
}
eCheckEffect = GetNextEffect(oPC);
}
//:: check if equipped with a ranged weapon and apply effect again if not
if (!GetWeaponRanged(oItem))
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
}
// Execute scripts hooked to this event for the player triggering it
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERUNEQUIPITEM);
ExecuteAllScriptsHookedToEvent(oItem, EVENT_ITEM_ONPLAYERUNEQUIPITEM);
// Tag-based scripting hook for PRC items
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_UNEQUIP);
ExecuteScript("is_"+GetTag(oItem), OBJECT_SELF);
}
void DoWeaponUnequip(object oPC, object oItem)
{
//initialize variables
int nRealSize = PRCGetCreatureSize(oPC); //size for Finesse/TWF
int nSize = nRealSize; //size for equipment restrictions
int nWeaponSize = GetWeaponSize(oItem);
//Powerful Build bonus
if(GetHasFeat(FEAT_RACE_POWERFUL_BUILD, oPC))
nSize++;
//Monkey Grip
if(GetHasFeat(FEAT_MONKEY_GRIP, oPC))
{
nSize++;
// If you try and use the big weapons
if (nWeaponSize > nRealSize)
{
SetCompositeAttackBonus(oPC, "MonkeyGripL", 0, ATTACK_BONUS_OFFHAND);
SetCompositeAttackBonus(oPC, "MonkeyGripR", 0, ATTACK_BONUS_ONHAND);
}
}
if(DEBUG) DoDebug("prc_restwpnsize - OnUnEquip");
// remove any TWF penalties
//if weapon was a not light, and there's still something equipped in the main hand(meaning that an offhand item was de-equipped)
if(nWeaponSize == nRealSize && GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) != OBJECT_INVALID)
{
//remove any effects added
SetCompositeAttackBonus(oPC, "OTWFPenalty", 0);
}
//remove any simulated finesse
if(GetHasFeat(FEAT_WEAPON_FINESSE, oPC) && nWeaponSize != -1)
{
//if left hand unequipped, clear
//if right hand unequipped, left hand weapon goes to right hand, so should still be cleared
SetCompositeAttackBonus(oPC, "ElfFinesseLH", 0, ATTACK_BONUS_OFFHAND);
//if right hand weapon unequipped
if(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) == oItem)
SetCompositeAttackBonus(oPC, "ElfFinesseRH", 0, ATTACK_BONUS_ONHAND);
}
//remove any two-handed weapon bonus
SetCompositeDamageBonusT(oItem, "THFBonus", 0);
//No longer needed due to new weapon feats via Beamdog
/*DoWeaponFeatUnequip(oPC, oItem, ATTACK_BONUS_OFFHAND);
if(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) == oItem)
DoWeaponFeatUnequip(oPC, oItem, ATTACK_BONUS_ONHAND);*/
//clean any nonproficient penalties
SetCompositeAttackBonus(oPC, "Unproficient" + IntToString(ATTACK_BONUS_OFFHAND), 0, ATTACK_BONUS_OFFHAND);
if(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) == oItem)
SetCompositeAttackBonus(oPC, "Unproficient" + IntToString(ATTACK_BONUS_ONHAND), 0, ATTACK_BONUS_ONHAND);
}