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