forked from Jaysyn/PRC8
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<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();
|
|||
|
}
|