2026/05/26 Update
Updated PRC8 version number. Added SoundImpact to Damning Darkness in vfx_persistent.2da. Updated CheckPRCLimitations() to make Darkness, Deeper Darkness & Damning Darkness work better. Fixed PnP Darkness & PnP Damning Darkness. Fixed Oversized Two-Weapon Fighting. Updated TLK for Attune Gem. Fixed typo in Calm Emotions description. Updated changelog.
This commit is contained in:
@@ -9,6 +9,10 @@
|
||||
Modified: June 12, 2006
|
||||
|
||||
Flaming_Sword: Added touch attack roll
|
||||
|
||||
Fixed by: Jaysyn
|
||||
Date: 2026-05-26 19:53:19
|
||||
|
||||
*/
|
||||
|
||||
#include "prc_sp_func"
|
||||
@@ -53,54 +57,75 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
||||
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
object oItemTarget = oTarget;
|
||||
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
||||
{ //touch attack roll if target creature is not an ally
|
||||
// ally = friendly or party member
|
||||
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
||||
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
||||
|
||||
if(iAttackRoll > 0)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
||||
if(!GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
//no armor, check other slots
|
||||
int i;
|
||||
for(i=0;i<14;i++)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(i, oTarget);
|
||||
if(GetIsObjectValid(oItemTarget))
|
||||
break;//end for loop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
||||
{
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, fDuration, TRUE, -1, nCasterLevel);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
||||
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
// If nothing is valid
|
||||
else if (!GetIsObjectValid(oItemTarget) && !GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
||||
else
|
||||
{
|
||||
object oItemTarget = oTarget;
|
||||
|
||||
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
||||
{ //touch attack roll if target creature is not an ally
|
||||
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
||||
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
||||
|
||||
if(iAttackRoll > 0)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
||||
if(DEBUG) DoDebug("Darkness: Chest item = " + DebugObject2Str(oItemTarget));
|
||||
if(!GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
//no armor, check other slots
|
||||
int i;
|
||||
for(i=0;i<14;i++)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(i, oTarget);
|
||||
if(GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
if(DEBUG) DoDebug("Darkness: Found item in slot " + IntToString(i));
|
||||
break;//end for loop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply item property if valid item found
|
||||
if(GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
if(DEBUG) DoDebug("Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel);
|
||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||
if(DEBUG) DoDebug("Darkness: IP applied");
|
||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||
}
|
||||
// Otherwise fall through to location-based AOE
|
||||
}
|
||||
else
|
||||
{
|
||||
// Touch attack failed - do nothing
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
||||
{
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
||||
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
//otherwise items get an IP
|
||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel);
|
||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||
//this applies the effects relating to it
|
||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||
}
|
||||
}
|
||||
// Ground casting or creatures with no equipment - location-based AOE
|
||||
else if(GetObjectType(oTarget) != OBJECT_TYPE_CREATURE || !GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
||||
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
// Valid item found on creature - apply item property
|
||||
else
|
||||
{
|
||||
if(DEBUG) DoDebug("Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel);
|
||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||
if(DEBUG) DoDebug("Darkness: IP applied");
|
||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||
}
|
||||
}
|
||||
|
||||
return iAttackRoll; //return TRUE if spell charges should be decremented
|
||||
|
||||
@@ -30,7 +30,11 @@ Arcane Material Component: A dollop of pitch with a
|
||||
tiny needle hidden inside it.
|
||||
|
||||
Author: Tenjac
|
||||
Created:
|
||||
Created:
|
||||
|
||||
Fixed by: Jaysyn
|
||||
Date: 2026-05-26 19:53:19
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
@@ -46,108 +50,135 @@ Created:
|
||||
// eg. touch attack hits
|
||||
//
|
||||
// Variables passed may be changed if necessary
|
||||
int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
||||
{
|
||||
//Declare major variables including Area of Effect Object
|
||||
int iAttackRoll = 1;
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nPnP = GetPRCSwitch(PRC_PNP_DARKNESS);
|
||||
float fDuration = nPnP ? TurnsToSeconds(nCasterLevel * 10) : RoundsToSeconds(nCasterLevel);//10min/level for PnP
|
||||
effect eAOE = EffectAreaOfEffect(AOE_PER_DAMNDARK);
|
||||
|
||||
//Make sure duration does no equal 0
|
||||
if(fDuration < 6.0f)
|
||||
fDuration = 6.0f;
|
||||
|
||||
//Check Extend metamagic feat.
|
||||
if(nMetaMagic & METAMAGIC_EXTEND)
|
||||
fDuration *= 2;
|
||||
|
||||
if(!nPnP)
|
||||
{
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
object oItemTarget = oTarget;
|
||||
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
||||
{ //touch attack roll if target creature is not an ally
|
||||
// ally = friendly or party member
|
||||
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
||||
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
||||
|
||||
if(iAttackRoll > 0)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
||||
if(!GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
//no armor, check other slots
|
||||
int i;
|
||||
for(i=0;i<14;i++)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(i, oTarget);
|
||||
if(GetIsObjectValid(oItemTarget))
|
||||
break;//end for loop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE || !GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, fDuration, TRUE, -1, nCasterLevel);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(GetLocation(oTarget), "AOE_PER_DAMNDARK");
|
||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
// If nothing is valid
|
||||
else if (!GetIsObjectValid(oItemTarget) && !GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
||||
{
|
||||
//Declare major variables including Area of Effect Object
|
||||
int iAttackRoll = 1;
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nPnP = GetPRCSwitch(PRC_PNP_DARKNESS);
|
||||
float fDuration = nPnP ? TurnsToSeconds(nCasterLevel * 10) : RoundsToSeconds(nCasterLevel);//10min/level for PnP
|
||||
effect eAOE = EffectAreaOfEffect(AOE_PER_DAMNDARK);
|
||||
|
||||
//Make sure duration does no equal 0
|
||||
if(fDuration < 6.0f)
|
||||
fDuration = 6.0f;
|
||||
|
||||
//Check Extend metamagic feat.
|
||||
if(nMetaMagic & METAMAGIC_EXTEND)
|
||||
fDuration *= 2;
|
||||
|
||||
int nShadow = PRCMax(GetLocalInt(oCaster, "ShadowMantle_Shoulder"), GetLocalInt(oTarget, "ShadowMantle_Shoulder"));
|
||||
if (nShadow) nPnP = FALSE;
|
||||
if (DEBUG) DoDebug("sp_damng_dark: oCaster "+GetName(oCaster)+" oTarget "+GetName(oTarget)+" nSwitch "+IntToString(nPnP));
|
||||
|
||||
if(!nPnP)
|
||||
{
|
||||
if (nShadow)
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oCaster, fDuration);
|
||||
else
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
object oItemTarget = oTarget;
|
||||
|
||||
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
||||
{ //touch attack roll if target creature is not an ally
|
||||
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
||||
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
||||
|
||||
if(iAttackRoll > 0)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
||||
if(DEBUG) DoDebug("Damning Darkness: Chest item = " + DebugObject2Str(oItemTarget));
|
||||
if(!GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
//no armor, check other slots
|
||||
int i;
|
||||
for(i=0;i<14;i++)
|
||||
{
|
||||
oItemTarget = GetItemInSlot(i, oTarget);
|
||||
if(GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
if(DEBUG) DoDebug("Damning Darkness: Found item in slot " + IntToString(i));
|
||||
break;//end for loop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply item property if valid item found
|
||||
if(GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
if(DEBUG) DoDebug("Damning Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DAMNING_DARKNESS, nCasterLevel);
|
||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||
if(DEBUG) DoDebug("Damning Darkness: IP applied");
|
||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||
}
|
||||
// Otherwise fall through to location-based AOE
|
||||
}
|
||||
else
|
||||
{
|
||||
// Touch attack failed - do nothing
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
||||
{
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
// Ground casting or creatures with no equipment - location-based AOE
|
||||
else if(GetObjectType(oTarget) != OBJECT_TYPE_CREATURE || !GetIsObjectValid(oItemTarget))
|
||||
{
|
||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||
|
||||
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||
}
|
||||
// Valid item found on creature - apply item property
|
||||
else
|
||||
{
|
||||
if(DEBUG) DoDebug("Damning Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DAMNING_DARKNESS, nCasterLevel);
|
||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||
if(DEBUG) DoDebug("Damning Darkness: IP applied");
|
||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||
}
|
||||
else
|
||||
{
|
||||
//otherwise items get an IP
|
||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DAMNING_DARKNESS, nCasterLevel);
|
||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||
//this applies the effects relating to it
|
||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||
}
|
||||
}
|
||||
|
||||
return iAttackRoll; //return TRUE if spell charges should be decremented
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
if(!X2PreSpellCastCode()) return;
|
||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||
object oCaster = OBJECT_SELF;
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
||||
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags
|
||||
if(!nEvent) //normal cast
|
||||
{
|
||||
if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
|
||||
{ //holding the charge, casting spell on self
|
||||
SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges
|
||||
return;
|
||||
}
|
||||
DoSpell(oCaster, oTarget, nCasterLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(nEvent & PRC_SPELL_EVENT_ATTACK)
|
||||
{
|
||||
if(DoSpell(oCaster, oTarget, nCasterLevel))
|
||||
DecrementSpellCharges(oCaster);
|
||||
}
|
||||
}
|
||||
PRCSetSchool();
|
||||
}
|
||||
|
||||
return iAttackRoll; //return TRUE if spell charges should be decremented
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
if(!X2PreSpellCastCode()) return;
|
||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||
object oCaster = OBJECT_SELF;
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
||||
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags
|
||||
if(!nEvent) //normal cast
|
||||
{
|
||||
if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
|
||||
{ //holding the charge, casting spell on self
|
||||
SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges
|
||||
return;
|
||||
}
|
||||
DoSpell(oCaster, oTarget, nCasterLevel);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(nEvent & PRC_SPELL_EVENT_ATTACK)
|
||||
{
|
||||
if(DoSpell(oCaster, oTarget, nCasterLevel))
|
||||
DecrementSpellCharges(oCaster);
|
||||
}
|
||||
}
|
||||
PRCSetSchool();
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Name Damning Darkness
|
||||
//:: FileName sp_damng_dark.nss
|
||||
//:: FileName sp_damng_darka.nss
|
||||
//:://////////////////////////////////////////////
|
||||
/**@file Damning Darkness
|
||||
Evocation [Darkness, Evil]
|
||||
@@ -31,55 +31,116 @@ tiny needle hidden inside it.
|
||||
|
||||
Author: Tenjac
|
||||
Created: 6/12/06
|
||||
|
||||
Fixed by: Jaysyn
|
||||
Date: 2026-05-26 19:53:19
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
void DarkLoop(object oTarget, object oPC);
|
||||
|
||||
|
||||
#include "prc_alterations"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||
|
||||
object oTarget = GetEnteringObject();
|
||||
object oPC = GetAreaOfEffectCreator();
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||||
effect eDark = EffectDarkness();
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
effect eLink = EffectLinkEffects(eDark, eDur);
|
||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, (600.0f * nCasterLvl));
|
||||
void DarkLoop(object oTarget, object oPC, int nMetaMagic);
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
||||
effect eDark = EffectDarkness();
|
||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||
|
||||
effect eLink = EffectLinkEffects(eDark, eDur);
|
||||
eLink = TagEffect(eLink, "BIO_DARKNESS");
|
||||
|
||||
effect eLink2 = EffectLinkEffects(eInvis, eDur);
|
||||
eLink2 = TagEffect(eLink2, "PNP_DARKNESS");
|
||||
|
||||
effect ePnP = EffectLinkEffects(eDur, EffectDarkness());
|
||||
if(GetPRCSwitch(PRC_PNP_DARKNESS_35ED))
|
||||
{
|
||||
ePnP = EffectLinkEffects(eDur, EffectConcealment(20));
|
||||
ePnP = TagEffect(ePnP, "PNP35_DARKNESS");
|
||||
}
|
||||
|
||||
object oTarget = GetEnteringObject();
|
||||
object oPC = GetAreaOfEffectCreator();
|
||||
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD,oTarget);
|
||||
|
||||
if (iShadow)
|
||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE);
|
||||
if (iShadow>1)
|
||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE);
|
||||
|
||||
int nDuration = PRCGetCasterLevel(oPC);
|
||||
if ((nMetaMagic & METAMAGIC_EXTEND))
|
||||
{
|
||||
nDuration = nDuration *2;
|
||||
}
|
||||
|
||||
if(GetIsObjectValid(oTarget) && oTarget != oPC)
|
||||
{
|
||||
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oPC))
|
||||
{
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DAMNING_DARKNESS));
|
||||
}
|
||||
else
|
||||
{
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DAMNING_DARKNESS, FALSE));
|
||||
}
|
||||
|
||||
if (iShadow)
|
||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||
else
|
||||
{
|
||||
if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
||||
else
|
||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget,0.0f,FALSE);
|
||||
}
|
||||
}
|
||||
else if (oTarget == oPC)
|
||||
{
|
||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DAMNING_DARKNESS, FALSE));
|
||||
if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
||||
else
|
||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||
}
|
||||
|
||||
// Set local variable to mark target as in AOE for damage tracking
|
||||
SetLocalInt(oTarget, "PRC_DamningDarkness_InAOE", TRUE);
|
||||
|
||||
// Start damage loop
|
||||
DarkLoop(oTarget, oPC, nMetaMagic);
|
||||
|
||||
PRCSetSchool();
|
||||
}
|
||||
|
||||
void DarkLoop(object oTarget, object oPC, int nMetaMagic)
|
||||
{
|
||||
// Check if target is still marked as being in the AOE
|
||||
if(GetIsObjectValid(oTarget) && GetLocalInt(oTarget, "PRC_DamningDarkness_InAOE"))
|
||||
{
|
||||
if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD)
|
||||
{
|
||||
int nDam = PRCMaximizeOrEmpower(6, 2, nMetaMagic) + SpellDamagePerDice(oPC, 2);
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_DIVINE), oTarget);
|
||||
}
|
||||
|
||||
DarkLoop(oTarget, oPC);
|
||||
|
||||
PRCSetSchool();
|
||||
}
|
||||
|
||||
void DarkLoop(object oTarget, object oPC)
|
||||
{
|
||||
if(GetIsObjectValid(oTarget))
|
||||
{
|
||||
if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD)
|
||||
{
|
||||
int nDam = SpellDamagePerDice(oPC, 2) + d6(2);
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_DIVINE), oTarget);
|
||||
}
|
||||
|
||||
else if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_NEUTRAL)
|
||||
{
|
||||
int nDam = SpellDamagePerDice(oPC, 2) + d6(2);
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_DIVINE), oTarget);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), oTarget, 1.0f);
|
||||
}
|
||||
else if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_NEUTRAL)
|
||||
{
|
||||
int nDam = PRCMaximizeOrEmpower(6, 1, nMetaMagic) + SpellDamagePerDice(oPC, 1);
|
||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_DIVINE), oTarget);
|
||||
}
|
||||
|
||||
}
|
||||
DelayCommand(6.0f, DarkLoop(oTarget, oPC));
|
||||
|
||||
else
|
||||
{
|
||||
// Evil creatures take no damage
|
||||
}
|
||||
|
||||
}
|
||||
DelayCommand(6.0f, DarkLoop(oTarget, oPC, nMetaMagic));
|
||||
}
|
||||
@@ -31,41 +31,47 @@ tiny needle hidden inside it.
|
||||
|
||||
Author: Tenjac
|
||||
Created:
|
||||
|
||||
Fixed by: Jaysyn
|
||||
Date: 2026-05-26 19:53:19
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "prc_alterations"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||
|
||||
//Declare major variables
|
||||
//Get the object that is exiting the AOE
|
||||
object oTarget = GetExitingObject();
|
||||
effect eAOE;
|
||||
if(GetHasSpellEffect(SPELL_DAMNING_DARKNESS, oTarget))
|
||||
{
|
||||
//Search through the valid effects on the target.
|
||||
eAOE = GetFirstEffect(oTarget);
|
||||
while (GetIsEffectValid(eAOE))
|
||||
{
|
||||
if (GetEffectCreator(eAOE) == GetAreaOfEffectCreator())
|
||||
{
|
||||
if(GetEffectType(eAOE) == EFFECT_TYPE_DARKNESS)
|
||||
{
|
||||
//If the effect was created by CotA then remove it
|
||||
if(GetEffectSpellId(eAOE) == SPELL_DAMNING_DARKNESS)
|
||||
{
|
||||
RemoveEffect(oTarget, eAOE);
|
||||
}
|
||||
}
|
||||
}
|
||||
//Get next effect on the target
|
||||
eAOE = GetNextEffect(oTarget);
|
||||
}
|
||||
}
|
||||
PRCSetSchool();
|
||||
#include "prc_alterations"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||
|
||||
object oTarget = GetExitingObject();
|
||||
object oPC = GetAreaOfEffectCreator();
|
||||
effect eAOE;
|
||||
|
||||
// Clear the in-AOE marker to stop damage tracking
|
||||
DeleteLocalInt(oTarget, "PRC_DamningDarkness_InAOE");
|
||||
|
||||
if(GetHasSpellEffect(SPELL_DAMNING_DARKNESS, oTarget))
|
||||
{
|
||||
//Search through the valid effects on the target.
|
||||
eAOE = GetFirstEffect(oTarget);
|
||||
while (GetIsEffectValid(eAOE))
|
||||
{
|
||||
if (GetEffectCreator(eAOE) == oPC)
|
||||
{
|
||||
if(GetEffectType(eAOE) == EFFECT_TYPE_DARKNESS)
|
||||
{
|
||||
//If the effect was created by Damning Darkness then remove it
|
||||
if(GetEffectSpellId(eAOE) == SPELL_DAMNING_DARKNESS)
|
||||
{
|
||||
RemoveEffect(oTarget, eAOE);
|
||||
}
|
||||
}
|
||||
}
|
||||
//Get next effect on the target
|
||||
eAOE = GetNextEffect(oTarget);
|
||||
}
|
||||
}
|
||||
PRCSetSchool();
|
||||
}
|
||||
Reference in New Issue
Block a user