Initial upload.
Adding base PRC 4.19a files to repository.
This commit is contained in:
112
trunk/spells/sp_maze.nss
Normal file
112
trunk/spells/sp_maze.nss
Normal file
@@ -0,0 +1,112 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: 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();
|
||||
}
|
Reference in New Issue
Block a user