PRC8/nwn/nwnprc/trunk/spells/sp_maze.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

112 lines
4.0 KiB
Plaintext
Raw 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.

//:://////////////////////////////////////////////
//:: Maze spellscript
//:: sp_maze
//:://////////////////////////////////////////////
/** @file
Maze
Conjuration (Teleportation)
Level: Sor/Wiz 8
Components: V, S
Casting Time: 1 standard action
Range: Close (25 ft. + 5 ft./2 levels)
Target: One creature
Duration: See text
Saving Throw: None
Spell Resistance: Yes
You banish the subject into an extradimensional labyrinth of force planes.
Each round on its turn, it may attempt a DC 20 Intelligence check to escape
the labyrinth as a full-round action. If the subject doesnt escape, the
maze disappears after 10 minutes, forcing the subject to leave. *
On escaping or leaving the maze, the subject reappears where it had been
when the maze spell was cast. If this location is filled with a solid
object, the subject appears in the nearest open space. Spells and abilities
that move a creature within a plane, such as teleport and dimension door,
do not help a creature escape a maze spell, although a plane shift spell
allows it to exit to whatever plane is designated in that spell.
Minotaurs are not affected by this spell.
* Implemented such that NPCs always try escape and PCs are given a choice
whether to attempt escape or not.
@author Ornedan
@date Created - 2005.10.18
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "spinc_maze"
void main()
{
// Set the spell school
PRCSetSchool(SPELL_SCHOOL_CONJURATION);
// Spellhook
if(!X2PreSpellCastCode()) return;
object oCaster = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nCasterLvl = PRCGetCasterLevel();
int nPenetr = nCasterLvl + SPGetPenetr();
//int nSpellID = PRCGetSpellId();
// Fire cast spell at event for the specified target. For friendlies, Maze is considered non-hostile
PRCSignalSpellEvent(oTarget, !GetIsFriend(oTarget));
// Minotaur check
if(GetRacialType(oTarget) == RACIAL_TYPE_MINOTAUR ||
GetRacialType(oTarget) == RACIAL_TYPE_KRYNN_MINOTAUR
)
{
SendMessageToPCByStrRef(oCaster, 16825703); // "The spell fails - minotaurs cannot be mazed."
return;
}
// Make SR check
if(!PRCDoResistSpell(oCaster, oTarget, nPenetr))
{
// Get the maze area
object oMazeArea = GetObjectByTag("prc_maze_01");
if(DEBUG && !GetIsObjectValid(oMazeArea))
DoDebug("Maze: ERROR: Cannot find maze area!", oCaster);
// Determine which entry to use
int nMaxEntry = GetLocalInt(oMazeArea, "PRC_Maze_Entries_Count");
int nEntry = Random(nMaxEntry) + 1;
object oEntryWP = GetWaypointByTag("PRC_MAZE_ENTRY_WP_" + IntToString(nEntry));
location lTarget = GetLocation(oEntryWP);
// Validity check
if(DEBUG && !GetIsObjectValid(oEntryWP))
DoDebug("Maze: ERROR: Selected waypoint does not exist!");
// Make sure the target can be teleported
if(GetCanTeleport(oTarget, lTarget, TRUE))
{
// Store the target's current location for return
SetLocalLocation(oTarget, "PRC_Maze_Return_Location", GetLocation(oTarget));
// Jump the target to the maze - the maze's scripts will handle the rest
DelayCommand(1.5f, AssignCommand(oTarget, JumpToLocation(lTarget)));
// Clear the action queue, so there's less chance of getting to abuse the ghost effect
AssignCommand(oTarget, ClearAllActions());
// Make the character ghost for the duration of the maze. Apply here so the effect gets a spellID association
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneGhost(), oTarget, 600.0f);
// Apply some VFX
DoMazeVFX(GetLocation(oTarget));
}
else
SendMessageToPCByStrRef(oCaster, 16825702); // "The spell fails - the target cannot be teleported."
}
PRCSetSchool();
}