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.
322 lines
12 KiB
Plaintext
322 lines
12 KiB
Plaintext
/*:://////////////////////////////////////////////
|
||
//:: Spell Name Telekinetic Sphere
|
||
//:: Spell FileName PHS_S_TelekinSp
|
||
//:://////////////////////////////////////////////
|
||
//:: In Game Spell desctiption
|
||
//:://////////////////////////////////////////////
|
||
Evocation [Force]
|
||
Level: Sor/Wiz 8
|
||
Components: V, S, M
|
||
Casting Time: 1 standard action
|
||
Range: Close (8M)
|
||
Effect: 0.33M-diameter/level sphere (1-ft.), centered around creatures or objects
|
||
Duration: 1 min./level (D)
|
||
Saving Throw: Reflex negates
|
||
Spell Resistance: Yes
|
||
|
||
This spell functions like resilient sphere, with the addition that the
|
||
creatures or objects inside the globe are nearly weightless. Anything
|
||
contained within an telekinetic sphere weighs only one-sixteenth of its
|
||
normal weight. You can telekinetically move anything in the sphere that
|
||
normally weighs 5,000 pounds or less. The telekinetic control extends from
|
||
you out to medium range (20M) after the sphere has succeeded in
|
||
encapsulating its contents.
|
||
|
||
You can move objects or creatures in the sphere that weigh a total of 5,000
|
||
pounds or less by concentrating on the sphere. You can begin moving a
|
||
sphere in the round after casting the spell. If you concentrate on doing so
|
||
(a standard action), you can move the sphere as much as 10 meters (30 feet)
|
||
in a round. If you cease concentrating, the sphere does not move in that
|
||
round. If you cease concentrating (voluntarily or due to failing a
|
||
Concentration check), you can resume concentrating on your next turn or any
|
||
later turn during the spell’s duration.
|
||
|
||
You can only concentrate on any one telekinetical sphere at once, and the
|
||
nearest to the point chosen is the one moved to the chosen location. You
|
||
cannot contain yourself within a telekinetic shpere.
|
||
|
||
Material Component: A hemispherical piece of clear crystal, a matching
|
||
hemispherical piece of gum arabic, and a pair of small bar magnets.
|
||
//:://////////////////////////////////////////////
|
||
//:: Spell Effects Applied / Notes
|
||
//:://////////////////////////////////////////////
|
||
This will encase creatures. Each one has a seperate size, well, of course
|
||
all of a similar type (all orgres, all dragons...all hobgoblins).
|
||
|
||
Each level means 0.33M more radius. Hmm, that translates to 0.33 per 2 levels,
|
||
at level 10, it'd be 3.33M radius, big enough for many creatures.
|
||
|
||
Reflex save negates, SR applies.
|
||
|
||
Oh, and this version is not resilient sphere, but telekinetic sphere. This
|
||
adds cutscene stuff, and this cutscene can be cancled.
|
||
//:://////////////////////////////////////////////
|
||
//:: Created By: Jasperre
|
||
//::////////////////////////////////////////////*/
|
||
|
||
#include "PHS_INC_SPELLS"
|
||
|
||
// Returns the diameter needed for oTarget to be encased. Usually it is the
|
||
// height of the creature, but sometimes they are wider then tall, so it
|
||
// returns that.
|
||
float GetCasterSize(object oTarget);
|
||
|
||
// Heartbeat to remove cutscene incase of dispelling ETC.
|
||
void TelekineticSphereCheck(object oTarget, object oCaster);
|
||
|
||
void main()
|
||
{
|
||
// Spell Hook Check.
|
||
if(!PHS_SpellHookCheck(PHS_SPELL_TELEKINETIC_SPHERE)) return;
|
||
|
||
// Delcare Major Variables
|
||
object oCaster = OBJECT_SELF;
|
||
object oTarget = GetSpellTargetObject();
|
||
int nSpellSaveDC = PHS_GetSpellSaveDC();
|
||
int nCasterLevel = PHS_GetCasterLevel();
|
||
int nMetaMagic = PHS_GetMetaMagicFeat();
|
||
float fSize = GetCasterSize(oTarget);
|
||
float fCasterSize = 0.33 * IntToFloat(nCasterLevel);
|
||
|
||
// Check sizes
|
||
// * If fCasterSize is, say, 3.33, but the target is 3.66 or over, we
|
||
// fail.
|
||
if(fCasterSize < fSize)
|
||
{
|
||
// Report failure
|
||
FloatingTextStringOnCreature("*Resilient sphere failed, target too large*", oCaster, FALSE);
|
||
return;
|
||
}
|
||
|
||
// Get duration
|
||
float fDuration = PHS_GetDuration(PHS_MINUTES, nCasterLevel, nMetaMagic);
|
||
|
||
// Declare effects
|
||
effect eStop = EffectCutsceneImmobilize(); // Applied seperatly.
|
||
effect eStopDur = EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION);
|
||
effect eDur = EffectVisualEffect(PHS_VFX_DUR_TELEKINETIC_SPHERE);
|
||
effect eImmunities = PHS_AllImmunitiesLink();
|
||
|
||
// Link effects
|
||
effect eLink = EffectLinkEffects(eDur, eStopDur);
|
||
eLink = EffectLinkEffects(eLink, eImmunities);
|
||
|
||
// Make the "effect eStop = EffectCutsceneImmobilize();" supernatural,
|
||
// so it isn't dispelled (will be removed if the spell is though)
|
||
eStop = SupernaturalEffect(eStop);
|
||
|
||
// Fire spell cast at event
|
||
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_TELEKINETIC_SPHERE, TRUE);
|
||
|
||
// PvP and plot/immortal check (Also catches any other telekinetic spheres)
|
||
if(!GetIsReactionTypeFriendly(oTarget) && PHS_CanCreatureBeDestroyed(oTarget))
|
||
{
|
||
// We don't check turning but DO check spell resistance + immunity.
|
||
if(!PHS_SpellResistanceCheck(oCaster, oTarget))
|
||
{
|
||
// Reflex save negates
|
||
if(!PHS_SavingThrow(SAVING_THROW_FORT, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_SPELL))
|
||
{
|
||
// Apply effects and visuals. "Plot" is a case of them having lots
|
||
// of immunities.
|
||
PHS_ApplyDuration(oTarget, eLink, fDuration);
|
||
// Apply the immobilize seperatly in this case
|
||
PHS_ApplyDuration(oTarget, eStop, fDuration);
|
||
|
||
// Apply the heartbeat checks
|
||
DelayCommand(6.0, TelekineticSphereCheck(oTarget, oCaster));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// Heartbeat to remove cutscene incase of dispelling ETC.
|
||
void TelekineticSphereCheck(object oTarget, object oCaster)
|
||
{
|
||
// Valid target
|
||
if(GetIsObjectValid(oTarget))
|
||
{
|
||
// Check for immunities from the base spell, if none there, remove all
|
||
// (supernatural) cutscene immobilises from the target.
|
||
// * Any casters spell.
|
||
if(!PHS_GetHasEffectFromSpell(EFFECT_TYPE_IMMUNITY, oTarget, PHS_SPELL_TELEKINETIC_SPHERE))
|
||
{
|
||
// Remove all cutscene immobilises from the target.
|
||
// * From the Telekinetic Sphere, and the Movement "version"
|
||
PHS_RemoveSpecificEffectFromSpell(EFFECT_TYPE_CUTSCENEIMMOBILIZE, PHS_SPELL_TELEKINETIC_SPHERE, oTarget, SUBTYPE_SUPERNATURAL);
|
||
PHS_RemoveSpecificEffectFromSpell(EFFECT_TYPE_CUTSCENEIMMOBILIZE, PHS_SPELL_TELEKINETIC_SPHERE_MOVEMENT, oTarget, SUBTYPE_SUPERNATURAL);
|
||
}
|
||
else
|
||
{
|
||
// Another HB
|
||
DelayCommand(6.0, TelekineticSphereCheck(oTarget, oCaster));
|
||
}
|
||
}
|
||
}
|
||
|
||
// Returns the diameter needed for oTarget to be encased. Usually it is the
|
||
// height of the creature, but sometimes they are wider then tall, so it
|
||
// returns that.
|
||
float GetCasterSize(object oTarget)
|
||
{
|
||
/*
|
||
Lev = Diam | Radius
|
||
1 = 0.33 |
|
||
2 = 0.66 | 0.33
|
||
3 = 1.00 | 0.5
|
||
4 = 1.33 |
|
||
5 = 1.66 |
|
||
6 = 2.00 | 1
|
||
7 = 2.33 |
|
||
8 = 2.66 |
|
||
9 = 3.00 | 1.5
|
||
10 = 3.33 |
|
||
11 = 3.66 |
|
||
12 = 4.00 | 2
|
||
13 = 4.33 |
|
||
14 = 4.66 |
|
||
15 = 5.00 | 2.5
|
||
16 = 5.33 |
|
||
17 = 5.66 |
|
||
18 = 6.00 | 3
|
||
19 = 6.33 |
|
||
20 = 6.66 |
|
||
*/
|
||
|
||
// NOTE:
|
||
// CAN FINISH SOMETIME, AND I NEED TO REALLY (Dragons are not the
|
||
// same size as all Huge creatures).
|
||
|
||
// Check appearance first
|
||
switch(GetAppearanceType(oTarget))
|
||
{
|
||
// Do PC races first
|
||
// Human, the "Medium of medium".
|
||
// * Need 2.33M max, for the height really.
|
||
// "Medium: As Medium creatures, humans have no special bonuses or
|
||
// penalties due to their size."
|
||
case APPEARANCE_TYPE_HUMAN:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_01:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_02:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_03:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_04:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_05:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_06:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_07:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_08:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_09:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_10:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_11:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_FEMALE_12:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_01:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_02:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_03:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_04:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_05:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_06:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_07:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_08:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_09:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_10:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_11:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_12:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_13:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_14:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_15:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_16:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_17:
|
||
case APPEARANCE_TYPE_HUMAN_NPC_MALE_18:
|
||
{
|
||
return 2.33;
|
||
}
|
||
break;
|
||
// Dwarves
|
||
// "Medium: As Medium creatures, dwarves have no special bonuses or
|
||
// penalties due to their size."
|
||
case APPEARANCE_TYPE_DWARF:
|
||
case APPEARANCE_TYPE_DWARF_NPC_FEMALE:
|
||
case APPEARANCE_TYPE_DWARF_NPC_MALE:
|
||
{
|
||
return 2.33;
|
||
}
|
||
break;
|
||
// Half orcs are classed as medium too.
|
||
case APPEARANCE_TYPE_HALF_ORC:
|
||
case APPEARANCE_TYPE_HALF_ORC_NPC_FEMALE:
|
||
case APPEARANCE_TYPE_HALF_ORC_NPC_MALE_01:
|
||
case APPEARANCE_TYPE_HALF_ORC_NPC_MALE_02:
|
||
{
|
||
return 2.33;
|
||
}
|
||
break;
|
||
// Elves, they are slightly taller then humans, return the same value though.
|
||
// "Medium: As Medium creatures, elves have no special bonuses or
|
||
// penalties due to their size."
|
||
// Half elves too.
|
||
case APPEARANCE_TYPE_ELF:
|
||
case APPEARANCE_TYPE_HALF_ELF:// Have these in here too.
|
||
case APPEARANCE_TYPE_ELF_NPC_FEMALE:
|
||
case APPEARANCE_TYPE_ELF_NPC_MALE_01:
|
||
case APPEARANCE_TYPE_ELF_NPC_MALE_02:
|
||
{
|
||
return 2.33;
|
||
}
|
||
break;
|
||
// Halflings are dead tiny, like gnomes
|
||
// "Halflings stand about 3 feet tall and usually weigh between
|
||
// 30 and 35 pounds."
|
||
// Return 1.33M diameter (thier hands ETC). By default, the caster
|
||
// should be the right level anyway (level 4 spell)
|
||
case APPEARANCE_TYPE_HALFLING:
|
||
case APPEARANCE_TYPE_HALFLING_NPC_FEMALE:
|
||
case APPEARANCE_TYPE_HALFLING_NPC_MALE:
|
||
{
|
||
return 1.33;
|
||
}
|
||
break;
|
||
// Gnomes are the same as halflings
|
||
case APPEARANCE_TYPE_GNOME:
|
||
case APPEARANCE_TYPE_GNOME_NPC_FEMALE:
|
||
case APPEARANCE_TYPE_GNOME_NPC_MALE:
|
||
{
|
||
return 1.33;
|
||
}
|
||
break;
|
||
// Default: Default to size check.
|
||
default:
|
||
{
|
||
switch(GetCreatureSize(oTarget))
|
||
{
|
||
case CREATURE_SIZE_HUGE:
|
||
{
|
||
return 9.33;
|
||
}
|
||
break;
|
||
case CREATURE_SIZE_LARGE:
|
||
{
|
||
return 5.0;
|
||
}
|
||
break;
|
||
case CREATURE_SIZE_MEDIUM:
|
||
{
|
||
return 2.33;
|
||
}
|
||
break;
|
||
case CREATURE_SIZE_SMALL:
|
||
{
|
||
return 1.33;
|
||
}
|
||
break;
|
||
case CREATURE_SIZE_TINY:
|
||
{
|
||
return 0.66;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
// Return a default of 3.33M (level 10)
|
||
return 3.33;
|
||
}
|