Updated Release Archive
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.
This commit is contained in:
		
							
								
								
									
										116
									
								
								nwn/trunk/smp/phs_s_forcecage.nss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								nwn/trunk/smp/phs_s_forcecage.nss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
			
		||||
/*:://////////////////////////////////////////////
 | 
			
		||||
//:: Spell Name Forcecage
 | 
			
		||||
//:: Spell FileName PHS_S_Forcecage
 | 
			
		||||
//:://////////////////////////////////////////////
 | 
			
		||||
//:: In Game Spell desctiption
 | 
			
		||||
//:://////////////////////////////////////////////
 | 
			
		||||
    Forcecage
 | 
			
		||||
    Evocation [Force]
 | 
			
		||||
    Level: Sor/Wiz 7
 | 
			
		||||
    Components: V, S, M
 | 
			
		||||
    Casting Time: 1 standard action
 | 
			
		||||
    Range: Close (8M)
 | 
			
		||||
    Area: Barred cage (6.67-M. cube)
 | 
			
		||||
    Duration: 2 hours/level (D)
 | 
			
		||||
    Saving Throw: None
 | 
			
		||||
    Spell Resistance: No
 | 
			
		||||
 | 
			
		||||
    This powerful spell brings into being an immobile cubical prison composed of
 | 
			
		||||
    either bars of force.
 | 
			
		||||
 | 
			
		||||
    Creatures within the area are caught and contained unless they are too big to
 | 
			
		||||
    fit inside, in which case the spell automatically fails. Teleportation and
 | 
			
		||||
    other forms of astral travel provide a means of escape, but the force walls
 | 
			
		||||
    or bars extend into the Ethereal Plane, blocking ethereal travel.
 | 
			
		||||
 | 
			
		||||
    Like a wall of force spell, a forcecage resists dispel magic, but it is
 | 
			
		||||
    vulnerable to a disintegrate spell, and it can be destroyed by a sphere of
 | 
			
		||||
    annihilation or a rod of cancellation.
 | 
			
		||||
 | 
			
		||||
    This spell produces a 6.67-meter cube made of bands of force (similar to a
 | 
			
		||||
    wall of force spell) for bars. The bands are a half-inch wide, with half-inch
 | 
			
		||||
    gaps between them. Creatures are confined within the space. You can<61>t attack
 | 
			
		||||
    a creature in a barred cage with a weapon unless the weapon can fit between
 | 
			
		||||
    the gaps (No melee weapons will reach inside). Even against such weapons
 | 
			
		||||
    (including arrows and similar ranged attacks), a creature in the barred cage
 | 
			
		||||
    has cover. All spells and breath weapons can pass through the gaps in the
 | 
			
		||||
    bars.
 | 
			
		||||
 | 
			
		||||
    Material Component: Ruby dust worth 1,500 gp, which is tossed into the air
 | 
			
		||||
    and disappears when you cast the spell.
 | 
			
		||||
//:://////////////////////////////////////////////
 | 
			
		||||
//:: Spell Effects Applied / Notes
 | 
			
		||||
//:://////////////////////////////////////////////
 | 
			
		||||
    Needs 4 placeables for the bars, and an AOE within the centre of it. If
 | 
			
		||||
    any of the bars are destroyed (via. disintegration ETC), it means the entire
 | 
			
		||||
    spell collapses.
 | 
			
		||||
 | 
			
		||||
    The AOE is plotted too, and does the correct 50% vs ranged attack consealment
 | 
			
		||||
    as they will have to shoot through the bars.
 | 
			
		||||
//:://////////////////////////////////////////////
 | 
			
		||||
//:: Created By: Jasperre
 | 
			
		||||
//::////////////////////////////////////////////*/
 | 
			
		||||
 | 
			
		||||
#include "PHS_INC_SPELLS"
 | 
			
		||||
 | 
			
		||||
void main()
 | 
			
		||||
{
 | 
			
		||||
    // Spell hook check.
 | 
			
		||||
    if(!PHS_SpellHookCheck(PHS_SPELL_FORCECAGE)) return;
 | 
			
		||||
 | 
			
		||||
    // Declare major variables
 | 
			
		||||
    object oCaster = OBJECT_SELF;
 | 
			
		||||
    location lTarget = GetSpellTargetLocation();
 | 
			
		||||
    int nCasterLevel = PHS_GetCasterLevel();
 | 
			
		||||
    int nMetaMagic = PHS_GetMetaMagicFeat();
 | 
			
		||||
    object oArea = GetArea(oCaster);
 | 
			
		||||
 | 
			
		||||
    // Requires ruby dust of at least 1500 gp value
 | 
			
		||||
    if(!PHS_ComponentExactItemRemove(PHS_ITEM_RUBY_DUST_1500, "Ruby dust worth at least 1500 gp", "Forcecage")) return;
 | 
			
		||||
 | 
			
		||||
    // Duration - 2 hours/level
 | 
			
		||||
    float fDuration = PHS_GetDuration(PHS_HOURS, nCasterLevel * 2, nMetaMagic);
 | 
			
		||||
 | 
			
		||||
    // Declare effects
 | 
			
		||||
    effect eAOE = EffectAreaOfEffect(PHS_AOE_PER_FORCECAGE);
 | 
			
		||||
    // Impact VFX
 | 
			
		||||
    effect eImpact = EffectVisualEffect(PHS_VFX_FNF_FORCECAGE);
 | 
			
		||||
 | 
			
		||||
    // We create the barriers!
 | 
			
		||||
    // - Set the barriers on the caster so the AOE can grab them on its first
 | 
			
		||||
    //   OnEnter pass.
 | 
			
		||||
    string sResRef = "phs_forcewall";
 | 
			
		||||
    object oForceWall;
 | 
			
		||||
    // Get vectors to change
 | 
			
		||||
    vector vOriginal = GetPositionFromLocation(lTarget);
 | 
			
		||||
    float fXDefault = vOriginal.x;
 | 
			
		||||
    float fYDefault = vOriginal.y;
 | 
			
		||||
    float fZDefault = vOriginal.z;
 | 
			
		||||
    // Distance from centre the placeable will go
 | 
			
		||||
    float fDist = 3.34;
 | 
			
		||||
 | 
			
		||||
    // First one: North of the target location by half of 6.68M (3.34M), north
 | 
			
		||||
    // with DIRECTION_NORTH facing. Add on 3.34 onto X only.
 | 
			
		||||
    location lPlaceable = Location(oArea, Vector(fXDefault + fDist, fYDefault, fZDefault), DIRECTION_NORTH);
 | 
			
		||||
    // Create and set North one.
 | 
			
		||||
    oForceWall = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, lPlaceable);
 | 
			
		||||
    SetLocalObject(oCaster, "PHS_FORCEWALL_WALL1", oForceWall);
 | 
			
		||||
 | 
			
		||||
    // DIRECTION_EAST one - go +3.34 in Y
 | 
			
		||||
    lPlaceable = Location(oArea, Vector(fXDefault, fYDefault + fDist, fZDefault), DIRECTION_EAST);
 | 
			
		||||
    oForceWall = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, lPlaceable);
 | 
			
		||||
    SetLocalObject(oCaster, "PHS_FORCEWALL_WALL2", oForceWall);
 | 
			
		||||
 | 
			
		||||
    // DIRECTION_SOUTH one - go -3.34 in X
 | 
			
		||||
    lPlaceable = Location(oArea, Vector(fXDefault - fDist, fYDefault, fZDefault), DIRECTION_SOUTH);
 | 
			
		||||
    oForceWall = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, lPlaceable);
 | 
			
		||||
    SetLocalObject(oCaster, "PHS_FORCEWALL_WALL3", oForceWall);
 | 
			
		||||
 | 
			
		||||
    // DIRECTION_WEST one - go -3.34 in Y
 | 
			
		||||
    lPlaceable = Location(oArea, Vector(fXDefault, fYDefault + fDist, fZDefault), DIRECTION_WEST);
 | 
			
		||||
    oForceWall = CreateObject(OBJECT_TYPE_PLACEABLE, sResRef, lPlaceable);
 | 
			
		||||
    SetLocalObject(oCaster, "PHS_FORCEWALL_WALL4", oForceWall);
 | 
			
		||||
 | 
			
		||||
    // Apply effects
 | 
			
		||||
    PHS_ApplyLocationDurationAndVFX(lTarget, eImpact, eAOE, fDuration);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user