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

126 lines
4.9 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.

//:://////////////////////////////////////////////
//:: Power: Dissolving Weapon
//:: psi_pow_disswpn
//:://////////////////////////////////////////////
/** @file
Dissolving Weapon
Psychometabolism [Acid]
Level: Psychic warrior 2
Manifesting Time: 1 standard action
Range: Personal
Target: One held weapon; see text
Duration: Instantaneous
Saving Throw: None
Power Resistance: No
Power Points: 3
Metapsionics: Empower, Maximize, Twin
Your weapon is corrosive, and sizzling moisture visibly oozes from it.
You deal 4d6 points of acid damage to any creature or object you touch
with your successful melee attack. Your weapon is charged with acid until
you make a successful attack.
Augment: For every 2 additional power points you spend, this powers damage
increases by 1d6 points.
@author Ornedan
@date Created - 2005.01.19
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
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_ITEM_ONHIT)
{
if (!PsiPrePowerCastCode()){ return; }
object oManifester = OBJECT_SELF;
object oWeapon = IPGetTargetedOrEquippedMeleeWeapon();
// Validity check
if(!GetIsObjectValid(oWeapon))
{
FloatingTextStrRefOnCreature(83615, oManifester); // Item must be weapon or creature holding a weapon
return;
}
struct manifestation manif =
EvaluateManifestation(oManifester, OBJECT_INVALID,
PowerAugmentationProfile(PRC_NO_GENERIC_AUGMENTS,
2, PRC_UNLIMITED_AUGMENTATION
),
METAPSIONIC_EMPOWER | METAPSIONIC_MAXIMIZE | METAPSIONIC_TWIN
);
if(manif.bCanManifest)
{
int nNumberOfDice = 4 + manif.nTimesAugOptUsed_1;
int nDieSize = 6;
int nDamage;
effect eVis = EffectVisualEffect(VFX_IMP_PULSE_NATURE);
object oPossessor = GetItemPossessor(oWeapon);
/* Apply the VFX to whatever is wielding the target */
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPossessor);
// Create the damages array if it doesn't already exist
if(!array_exists(oWeapon, "PRC_Power_DissolvingWeapon_Damages"))
array_create(oWeapon, "PRC_Power_DissolvingWeapon_Damages");
// Handle Twin Power
int nRepeats = manif.bTwin ? 2 : 1;
for(; nRepeats > 0; nRepeats--)
{
// Roll the damage here and store it on the weapon
nDamage = MetaPsionicsDamage(manif, nDieSize, nNumberOfDice, 0, 0, TRUE, FALSE);
array_set_int(oWeapon, "PRC_Power_DissolvingWeapon_Damages",
array_get_size(oWeapon, "PRC_Power_DissolvingWeapon_Damages"),
nDamage
);
}
// Hook to the item's OnHit
AddEventScript(oWeapon, EVENT_ITEM_ONHIT, "psi_pow_disswpn", TRUE, FALSE);
/* Add the onhit spell to the weapon */
IPSafeAddItemProperty(oWeapon, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 9999.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}// end if - Successfull manifestation
}// end if - Running manifestation
else
{
object oManifester = OBJECT_SELF;
object oWeapon = GetSpellCastItem();
object oTarget = PRCGetSpellTargetObject();
int nDamage = array_get_int(oWeapon, "PRC_Power_DissolvingWeapon_Damages",
array_get_size(oWeapon, "PRC_Power_DissolvingWeapon_Damages") - 1
);
nDamage = GetTargetSpecificChangesToDamage(oTarget, oManifester, nDamage, TRUE, TRUE);
effect eDamage = EffectDamage(nDamage, DAMAGE_TYPE_ACID);
effect eLink = EffectLinkEffects(eDamage, EffectVisualEffect(VFX_IMP_ACID_L));
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
// Remove the damage value from the array
int nNewSize = array_get_size(oWeapon, "PRC_Power_DissolvingWeapon_Damages") - 1;
if(nNewSize > 0)
array_shrink(oWeapon, "PRC_Power_DissolvingWeapon_Damages", nNewSize);
else
{
array_delete(oWeapon, "PRC_Power_DissolvingWeapon_Damages");
RemoveEventScript(oWeapon, EVENT_ITEM_ONHIT, "psi_pow_disswpn", TRUE, FALSE);
}
}// end else - Running OnHit
}