Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
112 lines
4.0 KiB
Plaintext
112 lines
4.0 KiB
Plaintext
//:://////////////////////////////////////////////
|
||
//:: 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’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();
|
||
} |