PRC8_fork/nwn/nwnprc/trunk/smp/phs_s_command.nss

150 lines
6.2 KiB
Plaintext
Raw Permalink Normal View History

/*:://////////////////////////////////////////////
//:: 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 can<61>t 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 can<61>t 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;
}
}
}
}
}
}
}