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