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