PRC8/nwn/nwnprc/trunk/smp/phs_s_command.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

150 lines
6.2 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.

/*:://////////////////////////////////////////////
//:: Spell Name Command
//:: Spell FileName PHS_S_Command
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Mind affecting, close range, 1 living creature target, 1 round duration,
will negates, SR applies.
You give the subject a single command, which it obeys to the best of its
ability at its earliest opportunity. You may select from the following options.
- Approach: On its turn, the subject moves toward you as quickly and directly
as possible for 1 round. The creature may do nothing but move during its
turn, and it provokes attacks of opportunity for this movement as normal.
- Drop: On its turn, the subject drops whatever it is holding. It cant pick
up any dropped item until its next turn.
- Fall: On its turn, the subject falls to the ground and remains prone for 1
round. It may act normally while prone but takes any appropriate penalties.
- Flee: On its turn, the subject moves away from you as quickly as possible
for 1 round. It may do nothing but move during its turn, and it provokes
attacks of opportunity for this movement as normal.
- Halt: The subject stands in place for 1 round. It may not take any actions
but is not considered helpless.
If the subject cant carry out your command on its next turn, the spell
automatically fails.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Can set what the effect will be before the spell is cast, or use a sub-dial
menu for the spell (does it work right with SR and Globes though?)
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Spell hook check.
if(!PHS_SpellHookCheck(PHS_SPELL_COMMAND)) return;
// Declare major variables
object oCaster = OBJECT_SELF;
object oTarget = GetSpellTargetObject();
int nCasterLevel = PHS_GetCasterLevel();
int nSpellSaveDC = PHS_GetSpellSaveDC();
// Duration is 1 round (6 seconds)
float fDuration = RoundsToSeconds(1);
// Declare effects
effect eVis = EffectVisualEffect(VFX_IMP_DOOM);
effect eKnockdown = EffectKnockdown();;
// Get what one we will do
int nCommandType = GetLocalInt(oCaster, "PHS_SPELL_COMMAND");
// Types (keep as integers):
// 0 - Approach
// 1 - Drop
// 2 - Fall
// 3 - Flee
// 4 - Halt
// Check PvP settings
if(!GetIsReactionTypeFriendly(oTarget))
{
// Check if they can be commanded
if(GetCommandable(oTarget))
{
// Signal event
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_COMMAND);
// Check against mind spells
if(!PHS_ImmunityCheck(oTarget, IMMUNITY_TYPE_MIND_SPELLS))
{
// Check spell resistance
if(!PHS_SpellResistanceCheck(oCaster, oTarget))
{
// Will Saving throw versus fear negates
if(!PHS_SavingThrow(SAVING_THROW_WILL, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_FEAR))
{
// Do the different things
switch(nCommandType)
{
case 0: // Approach
{
DelayCommand(fDuration, SetCommandable(TRUE, oTarget));
AssignCommand(oTarget, ClearAllActions());
AssignCommand(oTarget, ActionMoveToObject(oCaster, TRUE));
SetCommandable(FALSE, oTarget);
}
break;
case 1: // Drop
{
// Check if the items are droppable - if not, they don't drop!
object oItem1 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
object oItem2 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
if(GetDroppableFlag(oItem1) || GetDroppableFlag(oItem2))
{
// Drop it
AssignCommand(oTarget, ClearAllActions());
if(GetDroppableFlag(oItem1))
{
AssignCommand(oTarget, ActionPutDownItem(oItem1));
}
if(GetDroppableFlag(oItem1))
{
AssignCommand(oTarget, ActionPutDownItem(oItem2));
}
}
}
break;
case 2: // Fall
{
// Knockdown
PHS_ApplyDuration(oTarget, eKnockdown, fDuration);
}
break;
case 3: // Flee
{
// Run away from us
DelayCommand(fDuration, SetCommandable(TRUE, oTarget));
AssignCommand(oTarget, ClearAllActions());
AssignCommand(oTarget, ActionMoveAwayFromObject(oCaster, TRUE));
SetCommandable(FALSE, oTarget);
}
break;
case 4: // Halt
{
// Just stop
DelayCommand(fDuration, SetCommandable(TRUE, oTarget));
AssignCommand(oTarget, ClearAllActions());
SetCommandable(FALSE, oTarget);
}
break;
}
}
}
}
}
}
}