PRC8_fork/nwn/nwnprc/trunk/smp/xxx_s_familiartr.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

120 lines
3.6 KiB
Plaintext

/*:://////////////////////////////////////////////
//:: Spell Name Familiar Transposition
//:: Spell FileName XXX_S_FamiliarTr
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Transmutation [Teleportation]
Level: Sor/Wiz 4
Components: V
Casting Time: 1 standard action
Range: Personal
Duration: Instantaneous
Saving Throw: None
Spell Resistance: No
Source: Various (Fordan)
This spell instantly transposes the caster and all gear and items he carries
with his familiar.
In order for the spell to succeed, the familiar must be within range of the
empathic link, i.e. in the same area, and actually summoned. The spell does
not work if the familiar is dead, unconscious, cannot move or under a
mind-affecting spell or effect.
M: A piece of glass with the name of the familiar etched on it.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Oh, sure, you can abuse it by unsummoning your familar, but oh well...
Still, not too bad, and easily scripted.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "SMP_INC_SPELLS"
// Check familiar
int CheckFamiliar(object oFamiliar);
// Jump to lTarget, using OBJECT_SELF as the person, and doing a VFX.
void DoJump(location lTarget);
void main()
{
// Spell Hook Check.
if(!SMP_SpellHookCheck(SMP_SPELL_FAMILIAR_TRANSPOSITION)) return;
// Declare major variables
object oCaster = OBJECT_SELF;
object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oCaster);
location lTarget = GetLocation(oFamiliar);
location lCaster = GetLocation(oCaster);
// Declare effects
effect eDissappear = EffectVisualEffect(VFX_FNF_TELEPORT_OUT);
// Make sure we can teleport
if(!SMP_CannotTeleport(oCaster, lTarget) &&
!SMP_CannotTeleport(oFamiliar, lCaster))
{
// Must be able to move
// Check the familiar
if(CheckFamiliar(oFamiliar))
{
// Jump to the target location with visual effects
SMP_ApplyLocationVFX(lCaster, eDissappear);
SMP_ApplyLocationVFX(lTarget, eDissappear);
// Move each object to the other place
// Jump and effects
DelayCommand(1.0, AssignCommand(oCaster, DoJump(lTarget)));
DelayCommand(1.0, AssignCommand(oFamiliar, DoJump(lCaster)));
}
}
}
// Check familiar
int CheckFamiliar(object oFamiliar)
{
effect eCheck = GetFirstEffect(oFamiliar);
while(GetIsEffectValid(eCheck))
{
switch(GetEffectType(eCheck))
{
case EFFECT_TYPE_CHARMED:
case EFFECT_TYPE_CONFUSED:
case EFFECT_TYPE_DAZED:
case EFFECT_TYPE_DOMINATED:
case EFFECT_TYPE_ENTANGLE:
case EFFECT_TYPE_FRIGHTENED:
case EFFECT_TYPE_PARALYZE:
case EFFECT_TYPE_PETRIFY:
case EFFECT_TYPE_SLEEP:
case EFFECT_TYPE_STUNNED:
case EFFECT_TYPE_TURNED:
{
return FALSE;
}
break;
}
// Get next effect
eCheck = GetNextEffect(oFamiliar);
}
if(!GetCommandable(oFamiliar))
{
return FALSE;
}
// TRUE if they can move
return TRUE;
}
// Jump to lTarget, using OBJECT_SELF as the person, and doing a VFX.
void DoJump(location lTarget)
{
JumpToLocation(lTarget);
SMP_ApplyLocationVFX(lTarget, EffectVisualEffect(VFX_FNF_TELEPORT_IN));
}