112 lines
4.0 KiB
Plaintext
Raw Permalink Normal View History

//:://////////////////////////////////////////////
//:: 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 doesn<73>t 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();
}