PRC8_fork/nwn/nwnprc/trunk/psionics/psi_pow_prevnm.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

149 lines
6.5 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
----------------
Prevenom
psi_pow_prevnm
----------------
5/11/05 by Stratovarius
*/ /** @file
Prevenom
Psychometabolism (Creation)
Level: Psychic warrior 1
Manifesting Time: 1 standard action
Range: Personal
Target: You
Duration: 1 min./level or until discharged
Saving Throw: None and Fortitude negates; see text
Power Points: 1
Metapsionics: Extend, Twin
If you have a claw attack (either from an actual natural weapon or from an
effect such as claws of the beast), you can use this power to produce a mild
venom that coats one of your claws. On your next successful melee attack,
the venom deals 2 points of Constitution damage. A target struck by the
poison can make a Fortitude save (DC 10 + 1/2 your manifester level + your
key ability modifier) to negate the damage.
Augment: For every 6 additional power points you spend, this powers
Constitution damage increases by 2 points.
*/
const int ERROR_CODE_5_FIX_AGAIN = 1;
#include "prc_alterations"
#include "prc_inc_spells"
#include "psi_inc_onhit"
#include "psi_inc_psifunc"
#include "psi_spellhook"
void main()
{
// Are we running the manifestation part or the onhit part?
if(GetRunningEvent() != EVENT_ONHIT)
{
if (!PsiPrePowerCastCode()){ return; }
object oManifester = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct manifestation manif =
EvaluateManifestation(oManifester, oTarget,
PowerAugmentationProfile(PRC_NO_GENERIC_AUGMENTS,
6, PRC_UNLIMITED_AUGMENTATION
),
METAPSIONIC_EXTEND | METAPSIONIC_TWIN);
if(manif.bCanManifest)
{
int nDamage = 2 + (2 * manif.nTimesAugOptUsed_1);
int nDC = 10
+ manif.nManifesterLevel / 2
+ GetAbilityModifier(GetAbilityOfClass(GetManifestingClass(oManifester)), oManifester);
effect eVis = EffectVisualEffect(VFX_IMP_PULSE_NATURE);
object oLClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oTarget);
object oRClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oTarget);
object oBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oTarget);
float fDuration = 60.0f * manif.nManifesterLevel;
if(manif.bExtend) fDuration *= 2;
// Must have a natural attack
if(!(GetIsObjectValid(oLClaw) || GetIsObjectValid(oRClaw) || GetIsObjectValid(oBite)))
{
// "Target does not posses a natural attack!"
FloatingTextStrRefOnCreature(16826656, oManifester, FALSE);
return;
}
/* Apply the VFX to the target */
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
// Create the values array if it doesn't already exist
if(!array_exists(oTarget, "PRC_Power_Prevenom_Values"))
array_create(oTarget, "PRC_Power_Prevenom_Values");
// Handle Twin Power
int nRepeats = manif.bTwin ? 2 : 1;
for(; nRepeats > 0; nRepeats--)
{
// Store the DC and the damage to be dealt on the creature
array_set_int(oTarget, "PRC_Power_Prevenom_Values",
array_get_size(oTarget, "PRC_Power_Prevenom_Values"),
(nDC << 16) | nDamage
);
}
// Hook to the weapons' OnHit
AddEventScript(oTarget, EVENT_ONHIT, "psi_pow_prevnm", TRUE, FALSE);
/* Add the onhit spell to the weapon */
IPSafeAddItemProperty(oLClaw, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), fDuration, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
IPSafeAddItemProperty(oRClaw, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), fDuration, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
IPSafeAddItemProperty(oBite, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), fDuration, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}// end if - Successfull manifestation
}// end if - Running manifestation
else
{
object oManifester = OBJECT_SELF;
object oItem = GetSpellCastItem();
object oTarget = PRCGetSpellTargetObject();
// Make sure the event was triggered by a natural weapon
if(oItem == GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oManifester) ||
oItem == GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oManifester) ||
oItem == GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oManifester)
)
{
int nArraySize = array_get_size(oManifester, "PRC_Power_Prevenom_Values");
int nValue = array_get_int(oManifester, "PRC_Power_Prevenom_Values", nArraySize - 1);
int nDamage = nValue & 0x0000FFFF;
int nDC = (nValue >>> 16 ) & 0x0000FFFF;
// Target-specific damage adjustments
nDamage = GetTargetSpecificChangesToDamage(oTarget, oManifester, nDamage, FALSE, FALSE);
if(DEBUG) DoDebug("psi_pow_prevnm: OnHit: Damage = " + IntToString(nDamage) + "; DC = " + IntToString(nDC));
// First check for poison immunity, if not, make a fort save versus spells.
if(!GetIsImmune(oTarget, IMMUNITY_TYPE_POISON) &&
!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_POISON, oManifester))
{
//Apply the poison effect and VFX impact
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_POISON_S), oTarget);
ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, nDamage, DURATION_TYPE_TEMPORARY, TRUE, -1.0f);
}
// Remove the damage value from the array
nArraySize -= 1;
if(nArraySize > 0)
array_shrink(oManifester, "PRC_Power_Prevenom_Values", nArraySize);
else
{
array_delete(oManifester, "PRC_Power_Prevenom_Values");
RemoveEventScript(oManifester, EVENT_ONHIT, "psi_pow_prevnm", TRUE, FALSE);
}
}// end if - Triggered by a natural weapon
}// end else - Running OnHit
}