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

97 lines
3.5 KiB
Plaintext

/** @file psi_pow_astseed
Astral Seed
Metacreativity
Level: Shaper 8
Manifesting Time: 10 minutes
Range: 0 ft.
Effect: One storage crystal
Duration: Instantaneous
Saving Throw: None
Power Resistance: No
Power Points: 15
Metapsionics: None
This power weaves strands of ectoplasm into a crystal containing the seed of your living mind. You may have only one seed in
existence at any one time. Until such time as you perish, the astral seed is totally inert. Upon dying, you are transported
to the location of your astral seed, where you will spend a day regrowing a body. Respawning in this manner will cost a level.
If your astral seed is destroyed, the power will fail.
@author Stratovarius
@date Created: Apr 9, 2005
@date Modified: Jul 3, 2006
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_sp_func"
int DoPower(object oManifester, object oTarget, struct manifestation manif)
{
// Destroy old seed, if any
object oSeed = GetLocalObject(oManifester, "PRC_AstralSeed_SeedObject");
if(GetIsObjectValid(oSeed))
MyDestroyObject(oSeed);
// Retrieve Module string for Seed ResRef
string sResRef = GetLocalString(GetModule(), PRC_PSI_ASTRAL_SEED_RESREF);
// If no Module Seed ResRef value is set, use the default
if (sResRef == "")
sResRef = "x2_plc_phylact";
// Create new seed
oSeed = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, PRCGetSpellTargetLocation());
// If the provided ResRef fails to generate a valid item, retry with the default phylactery
if (!GetIsObjectValid(oSeed))
oSeed = CreateObject(OBJECT_TYPE_PLACEABLE, "x2_plc_phylact", PRCGetSpellTargetLocation());
// Perform VFX
effect eVis = EffectVisualEffect(PSI_FNF_ASTRAL_SEED);
DelayCommand(0.5, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oSeed));
// Store a reference to the seed on the manifester
SetLocalObject(oManifester, "PRC_AstralSeed_SeedObject", oSeed);
// Add a hook to OnDeath event for the manifester
AddEventScript(oManifester, EVENT_ONPLAYERDEATH, "psi_astseed_resp", FALSE, FALSE);
return TRUE; //Held charge is used if at least 1 touch from twinned power hits
}
void main()
{
if(!PsiPrePowerCastCode()) return;
object oManifester = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct manifestation manif;
int nEvent = GetLocalInt(oManifester, PRC_SPELL_EVENT); //use bitwise & to extract flags
if(!nEvent) //normal cast
{
manif =
EvaluateManifestation(oManifester, OBJECT_INVALID,
PowerAugmentationProfile(),
METAPSIONIC_NONE
);
if(manif.bCanManifest)
{
if(GetLocalInt(oManifester, PRC_SPELL_HOLD) && oManifester == oTarget)
{ //holding the charge, manifesting power on self
SetLocalSpellVariables(oManifester, 1); //change 1 to number of charges
SetLocalManifestation(oManifester, PRC_POWER_HOLD_MANIFESTATION, manif);
return;
}
DoPower(oManifester, oTarget, manif);
}
}
else
{
if(nEvent & PRC_SPELL_EVENT_ATTACK)
{
manif = GetLocalManifestation(oManifester, PRC_POWER_HOLD_MANIFESTATION);
if(DoPower(oManifester, oTarget, manif))
DecrementSpellCharges(oManifester);
}
}
}