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.
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();
|
||
} |