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.
147 lines
8.5 KiB
Plaintext
147 lines
8.5 KiB
Plaintext
/*
|
||
11/02/19 by Stratovarius
|
||
|
||
Apprentice, Eyes of Darkness
|
||
Level/School: 1st/Divination (Scrying)
|
||
Range: Personal
|
||
Target: You
|
||
Duration: 1 minute/level (D)
|
||
|
||
You send your vision through shadows and into planar re? ections, altering your point of view.
|
||
|
||
You view the world as though you were standing in a different spot, up to a maximum distance of 25 feet plus 5 feet per two caster levels.
|
||
You cannot see through solid objects. You can, however, look around corners or over barriers, obtain a bird’s-eye view of your area, and
|
||
the like. Essentially, you shift your perspective as though you were located at any spot in range to which you have line of effect. You
|
||
can switch back and forth between your own eyes and your alternate viewpoint as a swift action. You can move your alternate perspective,
|
||
as in the spell arcane eye. Its speed is only 10 feet per round, however, and every round of such movement decreases the mystery’s
|
||
duration by 1 minute (if you move the perspective in the last minute of the duration, you gain a few seconds of vision at the new position
|
||
before the effect expires).
|
||
|
||
In the PRC, this is just a copy of Arcane Eye with 1 round/level duration to account for constantly moving about
|
||
*/
|
||
|
||
#include "shd_inc_shdfunc"
|
||
#include "shd_mysthook"
|
||
#include "prc_inc_scry"
|
||
|
||
void ApplyScryEffects(object oShadow)
|
||
{
|
||
if(DEBUG) DoDebug("prc_inc_scry: ApplyScryEffects():\n"
|
||
+ "oShadow = '" + GetName(oShadow) + "'"
|
||
);
|
||
// The Scryer is not supposed to be visible, nor can he move or cast
|
||
// He also can't take damage from scrying
|
||
effect eLink = EffectSpellImmunity(SPELL_ALL_SPELLS);
|
||
// Damage immunities
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_DIVINE, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_MAGICAL, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_NEGATIVE, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_POSITIVE, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING, 100));
|
||
eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC, 100));
|
||
// Specific immunities
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_ABILITY_DECREASE));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_BLINDNESS));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DEAFNESS));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_CRITICAL_HIT));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DEATH));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_DISEASE));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_ENTANGLE));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_SLOW));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_KNOCKDOWN));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_NEGATIVE_LEVEL));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_PARALYSIS));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_SILENCE));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_SNEAK_ATTACK));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_TRAP));
|
||
eLink = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_MIND_SPELLS));
|
||
// Random stuff
|
||
eLink = EffectLinkEffects(eLink, EffectCutsceneGhost());
|
||
eLink = EffectLinkEffects(eLink, EffectMovementSpeedDecrease(66));
|
||
eLink = EffectLinkEffects(eLink, EffectEthereal());
|
||
eLink = EffectLinkEffects(eLink, EffectAttackDecrease(50));
|
||
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY));
|
||
// Permanent until Scry ends
|
||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eLink), oShadow, GetLocalFloat(oShadow, "ScryDuration") + 6.0);
|
||
|
||
// Create array for storing a list of the nerfed weapons in
|
||
array_create(oShadow, "Scry_Nerfed");
|
||
|
||
object oWeapon;
|
||
itemproperty ipNoDam = ItemPropertyNoDamage();
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oShadow);
|
||
if(IPGetIsMeleeWeapon(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
|
||
}
|
||
// Check left hand only if right hand had a weapon
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oShadow);
|
||
if(IPGetIsMeleeWeapon(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
}else if(IPGetIsRangedWeapon(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oShadow);
|
||
if(GetIsObjectValid(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oShadow);
|
||
if(GetIsObjectValid(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oShadow);
|
||
if(GetIsObjectValid(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oShadow, "Scry_Nerfed", array_get_size(oShadow, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
}
|
||
|
||
void main()
|
||
{
|
||
if(!ShadPreMystCastCode()) return;
|
||
|
||
object oShadow = OBJECT_SELF;
|
||
object oTarget = PRCGetSpellTargetObject();
|
||
struct mystery myst = EvaluateMystery(oShadow, oTarget, METASHADOW_EXTEND);
|
||
|
||
if(myst.bCanMyst)
|
||
{
|
||
//Declare major variables
|
||
myst.fDur = RoundsToSeconds(myst.nShadowcasterLevel);
|
||
if(myst.bExtend) myst.fDur *= 2;
|
||
|
||
SetLocalInt(oShadow, "ScryCasterLevel", myst.nShadowcasterLevel);
|
||
SetLocalInt(oShadow, "ScrySpellId", myst.nMystId);
|
||
SetLocalInt(oShadow, "ScrySpellDC", 0);
|
||
SetLocalFloat(oShadow, "ScryDuration", myst.fDur);
|
||
|
||
// Apply the immunity effects
|
||
ApplyScryEffects(oShadow);
|
||
// Now do the rest of the spell.
|
||
ScryMain(oShadow, oShadow);
|
||
}
|
||
} |