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.
159 lines
8.4 KiB
Plaintext
159 lines
8.4 KiB
Plaintext
/*
|
||
18/02/19 by Stratovarius
|
||
|
||
Far Sight
|
||
|
||
Master, Eyes of the Night Sky
|
||
Level/School: 8th/Divination (Scrying)
|
||
Range: See text
|
||
Effect: Magical sensor
|
||
Duration: 1 minute/level
|
||
Saving Throw: Will negates
|
||
Spell Resistance: Yes
|
||
|
||
You alter your perceptions to see through any shadow, anywhere.
|
||
|
||
Far sight is similar to the spell greater scrying, with the modifications described here. This mystery allows you to see the subject’s true essence, as with the truth revealed mystery.
|
||
*/
|
||
|
||
#include "shd_inc_shdfunc"
|
||
#include "shd_mysthook"
|
||
#include "inc_dynconv"
|
||
|
||
void ApplyScryEffects(object oPC)
|
||
{
|
||
if(DEBUG) DoDebug("prc_inc_scry: ApplyScryEffects():\n"
|
||
+ "oPC = '" + GetName(oPC) + "'"
|
||
);
|
||
// 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, EffectCutsceneImmobilize());
|
||
eLink = EffectLinkEffects(eLink, EffectEthereal());
|
||
eLink = EffectLinkEffects(eLink, EffectAttackDecrease(50));
|
||
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY));
|
||
|
||
// True Seeing
|
||
effect eTrueSee = EffectTrueSeeing();
|
||
|
||
// Adjust to PnP-like True Seeing
|
||
if(GetPRCSwitch(PRC_PNP_TRUESEEING))
|
||
{
|
||
eTrueSee = EffectSeeInvisible();
|
||
int nSpot = GetPRCSwitch(PRC_PNP_TRUESEEING_SPOT_BONUS);
|
||
// Default to 15
|
||
if(nSpot == 0)
|
||
nSpot = 15;
|
||
effect eSpot = EffectSkillIncrease(SKILL_SPOT, nSpot);
|
||
eTrueSee = EffectLinkEffects(eTrueSee , eSpot);
|
||
}
|
||
eLink = EffectLinkEffects(eLink, eTrueSee);
|
||
// Permanent until Scry ends
|
||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eLink), oPC, GetLocalFloat(oPC, "ScryDuration") + 6.0);
|
||
|
||
|
||
|
||
// Create array for storing a list of the nerfed weapons in
|
||
array_create(oPC, "Scry_Nerfed");
|
||
|
||
object oWeapon;
|
||
itemproperty ipNoDam = ItemPropertyNoDamage();
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||
if(IPGetIsMeleeWeapon(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
||
}
|
||
// Check left hand only if right hand had a weapon
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
|
||
if(IPGetIsMeleeWeapon(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "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(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oPC);
|
||
if(GetIsObjectValid(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oPC);
|
||
if(GetIsObjectValid(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "Scry_Nerfed"), oWeapon);
|
||
}}
|
||
oWeapon = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);
|
||
if(GetIsObjectValid(oWeapon)){
|
||
if(!GetItemHasItemProperty(oWeapon, ITEM_PROPERTY_NO_DAMAGE)){
|
||
//SetLocalInt(oWeapon, "BaelnornProjection_NoDamage", TRUE);
|
||
AddItemProperty(DURATION_TYPE_PERMANENT, ipNoDam, oWeapon);
|
||
array_set_object(oPC, "Scry_Nerfed", array_get_size(oPC, "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)
|
||
{
|
||
myst.fDur = TurnsToSeconds(myst.nShadowcasterLevel);
|
||
if(myst.bExtend) myst.fDur *= 2;
|
||
SetLocalInt(oShadow, "ScryCasterLevel", myst.nShadowcasterLevel);
|
||
SetLocalInt(oShadow, "ScrySpellId", myst.nMystId);
|
||
SetLocalInt(oShadow, "ScrySpellDC", GetShadowcasterDC(oShadow));
|
||
SetLocalFloat(oShadow, "ScryDuration", myst.fDur);
|
||
|
||
StartDynamicConversation("prc_scry_conv", oShadow, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oShadow);
|
||
|
||
// Apply the immunity effects
|
||
ApplyScryEffects(oShadow);
|
||
}
|
||
} |