117 lines
4.9 KiB
Plaintext
117 lines
4.9 KiB
Plaintext
|
/*:://////////////////////////////////////////////
|
|||
|
//:: 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);
|
|||
|
}
|