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:
Jaysyn904
2026-05-26 22:53:34 -04:00
parent d375a56267
commit da1ff48ac3
15 changed files with 445 additions and 238 deletions

View File

@@ -1,3 +1,22 @@
Commit: Jaysyn904
Date: Sun May 25
Attune Gem was using the wrong prereqs.
Attune Gem didn't handle radial spells properly.
Attune Gem incorrectly allowed divine spells.
Attune Gem was checking the wrong resref for vanilla gems.
Attune Gem didn't handle stacks of gems properly.
Updated Attune Gem's TLK entry.
PRCGetSaveDC() wasn't using PRCGetSpellCastItem().
Damning Darkness' vfx_persistent.2da entry was typoed.
Damning Darkness was checking the wrong object for inventory item for validity.
Darkness invocation was checking the wrong object for inventory item for validity.
Deeper Darkness was checking the wrong object for inventory item for validity.
Darkness was checking the wrong object for inventory item for validity.
Fixed Dragon's Tooth range & save.
Hopefully fixed Seize Items' VFX.
Fixed Acolyte of the Skin's DR.
Commit: Jaysyn904 Commit: Jaysyn904
Date: Sun May 24 Date: Sun May 24
@@ -42,6 +61,7 @@ Fixed taking Ability Focus: Eldritch Blast from bricking a first level character
Archivist should use INT for epic spell DCs, not WIS. Archivist should use INT for epic spell DCs, not WIS.
Fixed Sublime Chord epic spell DCs. Fixed Sublime Chord epic spell DCs.
Commit: Jaysyn904 Commit: Jaysyn904
Date: Sat May 2 12:46:30 2026 Date: Sat May 2 12:46:30 2026

View File

@@ -2536,7 +2536,7 @@
2532 CLUTCH_OF_ORCUS 16829500 is_clutch_orcus N M vs 0x38 0x0a sp_clutch_orcus **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL02 **** SCO_LGRINEVIL01 VS_CHANT_NECR_HM vs_chant_necr_hf out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829501 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2532 CLUTCH_OF_ORCUS 16829500 is_clutch_orcus N M vs 0x38 0x0a sp_clutch_orcus **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL02 **** SCO_LGRINEVIL01 VS_CHANT_NECR_HM vs_chant_necr_hf out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829501 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2533 CRUSHING_FIST_OF_SPITE 16829502 is_crush_fs V M vs 0x3a 0x0c sp_crush_fs **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF up 1000 **** **** **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829503 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2533 CRUSHING_FIST_OF_SPITE 16829502 is_crush_fs V M vs 0x3a 0x0c sp_crush_fs **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF up 1000 **** **** **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829503 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2534 CURSE_OF_THE_PUTRID_HUSK 16829504 is_curse_phusk I S vs 0x3a 0x0a sp_curse_phusk 3 **** **** **** **** 3 3 1500 hand **** VCO_MEHANODD03 **** SCO_LGSPRODD01 VS_CHANT_ILLU_HM VS_CHANT_ILLU_HF out 1000 **** VCA_OUTMIND01 **** SCA_OUTMIND01 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16829505 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2534 CURSE_OF_THE_PUTRID_HUSK 16829504 is_curse_phusk I S vs 0x3a 0x0a sp_curse_phusk 3 **** **** **** **** 3 3 1500 hand **** VCO_MEHANODD03 **** SCO_LGSPRODD01 VS_CHANT_ILLU_HM VS_CHANT_ILLU_HF out 1000 **** VCA_OUTMIND01 **** SCA_OUTMIND01 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16829505 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2535 DAMNING_DARKNESS 16829506 is_damng_dark V T v 0x1a 0x2f sp_damng_dark **** 4 **** **** **** 4 4 1500 hand **** VCO_MEHANEVIL02 **** SCO_MEHANEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF touch 1000 **** **** **** SDR_BLACKOUT 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829507 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2535 DAMNING_DARKNESS 16829506 is_damng_dark V T v 0x3f 0x2f sp_damng_dark **** 4 **** **** **** 4 4 1500 hand **** VCO_MEHANEVIL02 **** SCO_MEHANEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF touch 1000 **** **** **** SDR_BLACKOUT 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829507 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2536 DEATH_BY_THORNS 16829508 is_dth_thorns C T vs 0x38 0x06 sp_dth_thorns **** 7 7 **** **** 7 7 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 VCO_MEHEDEVIL01 **** **** **** 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829509 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7 **** 7 **** 2536 DEATH_BY_THORNS 16829508 is_dth_thorns C T vs 0x38 0x06 sp_dth_thorns **** 7 7 **** **** 7 7 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 VCO_MEHEDEVIL01 **** **** **** 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829509 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7 **** 7 ****
2537 DEMONCALL 16829510 is_demoncall D P vs 0x38 0x09 sp_demoncall **** **** **** **** **** **** 2 1500 head VCO_MEHEDEVIL01 **** VCO_GRNDRED SCO_LGRINEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF up 1000 **** **** **** sdr_demonhand 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829511 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** 2537 DEMONCALL 16829510 is_demoncall D P vs 0x38 0x09 sp_demoncall **** **** **** **** **** **** 2 1500 head VCO_MEHEDEVIL01 **** VCO_GRNDRED SCO_LGRINEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF up 1000 **** **** **** sdr_demonhand 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829511 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** ****
2538 DEMONFLESH 16829512 is_demonflesh T P vs 0x3a 0x09 sp_demonflesh **** **** **** **** **** **** 1 1500 head VCO_MEHEDEVIL01 **** **** SCO_LGSPREVIL01 VS_CHANT_CONJ_LM VS_CHANT_CONJ_LF self 1000 **** **** VCA_UPHEXEVIL01 SDR_PARALYZED 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829513 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** 2538 DEMONFLESH 16829512 is_demonflesh T P vs 0x3a 0x09 sp_demonflesh **** **** **** **** **** **** 1 1500 head VCO_MEHEDEVIL01 **** **** SCO_LGSPREVIL01 VS_CHANT_CONJ_LM VS_CHANT_CONJ_LF self 1000 **** **** VCA_UPHEXEVIL01 SDR_PARALYZED 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829513 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** ****

View File

@@ -204,7 +204,7 @@
200 VFX_PER_FOGFREEZE C 5 **** **** **** **** **** 0 **** vps_fogfreeze vps_fogfreeze vps_fogfreeze 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogfreeze_L vps_fogfreeze_L vps_fogfreeze_L 200 VFX_PER_FOGFREEZE C 5 **** **** **** **** **** 0 **** vps_fogfreeze vps_fogfreeze vps_fogfreeze 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogfreeze_L vps_fogfreeze_L vps_fogfreeze_L
201 VFX_PER_FOGYELLOW C 5 **** **** **** **** **** 0 **** vps_fogyell vps_fogyell vps_fogyell 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogyell_L vps_fogyell_L vps_fogyell_L 201 VFX_PER_FOGYELLOW C 5 **** **** **** **** **** 0 **** vps_fogyell vps_fogyell vps_fogyell 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogyell_L vps_fogyell_L vps_fogyell_L
202 VFX_PER_FOGPURPLE C 5 **** **** **** **** **** 0 **** vps_fogpurp vps_fogpurp vps_fogpurp 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogpurp_L vps_fogpurp_L vps_fogpurp_L 202 VFX_PER_FOGPURPLE C 5 **** **** **** **** **** 0 **** vps_fogpurp vps_fogpurp vps_fogpurp 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogpurp_L vps_fogpurp_L vps_fogpurp_L
203 AOE_PER_DAMNDARK C 6.7 **** **** sp_damng_darka sp_damng_darkb **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 203 AOE_PER_DAMNDARK C 6.7 **** **** sp_damng_darka sp_damng_darkb **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
204 VFX_MOB_BRILLIANT_EMANATION C 30.48 **** **** sp_brill_emanA sp_brill_emanB **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 204 VFX_MOB_BRILLIANT_EMANATION C 30.48 **** **** sp_brill_emanA sp_brill_emanB **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
205 VFX_PER_UTTERDARK C 50 **** **** sp_utterdarkA sp_utterdarkB **** 0 844 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** **** 205 VFX_PER_UTTERDARK C 50 **** **** sp_utterdarkA sp_utterdarkB **** 0 844 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
206 VFX_PER_ACHAIERAI C 3.048 **** **** sp_cloud_achai sp_cloud_achaiB **** 0 845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 206 VFX_PER_ACHAIERAI C 3.048 **** **** sp_cloud_achai sp_cloud_achaiB **** 0 845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****

View File

@@ -458,7 +458,32 @@ int CheckPRCLimitations(object oItem, object oPC = OBJECT_INVALID)
DURATION_TYPE_TEMPORARY); DURATION_TYPE_TEMPORARY);
} }
} }
else if(ipType == ITEM_PROPERTY_AREA_OF_EFFECT) else if(ipType == ITEM_PROPERTY_AREA_OF_EFFECT)
{
// This should happen on equip, unequip, or dynamic IP addition
if(bEquip || bUnequip || !bEquip && !bUnequip)
{
// Remove existing AoE
effect eTest = GetFirstEffect(oPC);
while(GetIsEffectValid(eTest))
{
if(GetEffectCreator(eTest) == oItem
&& GetEffectType(eTest) == EFFECT_TYPE_AREA_OF_EFFECT)
{
RemoveEffect(oPC, eTest);
if(DEBUG) DoDebug("CheckPRCLimitations: Removing old AoE effect");
}
eTest = GetNextEffect(oPC);
}
// Create new AoE - Skip when unequipping
if(!bUnequip)
{
AssignCommand(oItem, _prc_inc_itmrstr_ApplyAoE(oPC, oItem, GetItemPropertySubType(ipTest), GetItemPropertyCostTable(ipTest)));
}
}
}
/* else if(ipType == ITEM_PROPERTY_AREA_OF_EFFECT)
{ {
// This should only happen on equip or unequip // This should only happen on equip or unequip
@@ -483,7 +508,7 @@ int CheckPRCLimitations(object oItem, object oPC = OBJECT_INVALID)
AssignCommand(oItem, _prc_inc_itmrstr_ApplyAoE(oPC, oItem, GetItemPropertySubType(ipTest), GetItemPropertyCostTable(ipTest))); AssignCommand(oItem, _prc_inc_itmrstr_ApplyAoE(oPC, oItem, GetItemPropertySubType(ipTest), GetItemPropertyCostTable(ipTest)));
}// end if - Equip event }// end if - Equip event
}// end if - Equip or Unequip event }// end if - Equip or Unequip event
}// end if - AoE iprp }// end if - AoE iprp */
else if(ipType == ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N) else if(ipType == ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N)
{ {
// Only equippable items can provide bonus spell slots // Only equippable items can provide bonus spell slots

View File

@@ -76,7 +76,7 @@
/* This variable MUST be updated with every new version of the PRC!!! */ /* This variable MUST be updated with every new version of the PRC!!! */
const string PRC_VERSION = "PRC8 4.91"; const string PRC_VERSION = "PRC8 4.92";
/* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */ /* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */

View File

@@ -1142,7 +1142,16 @@ void DoWeaponEquip(object oPC, object oItem, int nHand)
//:: Proceed with OSTWF bonuses if the restrictions are not met //:: Proceed with OSTWF bonuses if the restrictions are not met
if (!bIsRestricted) if (!bIsRestricted)
{ {
if (GetHasFeat(FEAT_OTWF, oPC)) if (GetHasFeat(FEAT_OTWF, oPC))
{
// When wielding a one-handed weapon in your off hand, you take penalties for fighting with two weapons as if you were wielding a light weapon in your off hand
if (nWeaponSize == nRealSize && nHand == ATTACK_BONUS_OFFHAND)
{
SetCompositeAttackBonus(oPC, "OTWFL", 2, ATTACK_BONUS_OFFHAND);
SetCompositeAttackBonus(oPC, "OTWFR", 2, ATTACK_BONUS_ONHAND);
}
}
/* if (GetHasFeat(FEAT_OTWF, oPC))
{ {
// When wielding a one-handed weapon in your off hand, you take penalties for fighting with two weapons as if you were wielding a light weapon in your off hand // When wielding a one-handed weapon in your off hand, you take penalties for fighting with two weapons as if you were wielding a light weapon in your off hand
if (nWeaponSize == nRealSize && nHand == ATTACK_BONUS_OFFHAND) if (nWeaponSize == nRealSize && nHand == ATTACK_BONUS_OFFHAND)
@@ -1156,7 +1165,7 @@ void DoWeaponEquip(object oPC, object oItem, int nHand)
SetCompositeAttackBonus(oPC, "OTWFR", 0, ATTACK_BONUS_ONHAND); SetCompositeAttackBonus(oPC, "OTWFR", 0, ATTACK_BONUS_ONHAND);
} }
} } */
} }
//check for proficiency //check for proficiency

View File

@@ -21,6 +21,8 @@
#include "shd_inc_myst" #include "shd_inc_myst"
#include "prc_inc_template" #include "prc_inc_template"
void ResetLionSwiftness(object oPC) void ResetLionSwiftness(object oPC)
{ {
int nLevel = GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC); int nLevel = GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC);
@@ -385,6 +387,30 @@ void RestStarted(object oPC)
SetLocalInt(oPC, "DRUNKEN_MASTER_IS_IN_DRUNKEN_RAGE", 0); SetLocalInt(oPC, "DRUNKEN_MASTER_IS_IN_DRUNKEN_RAGE", 0);
SetLocalInt(oPC, "DRUNKEN_MASTER_IS_DRUNK_LIKE_A_DEMON", 0); SetLocalInt(oPC, "DRUNKEN_MASTER_IS_DRUNK_LIKE_A_DEMON", 0);
} }
// Clean up temporary Darkness item properties from inventory
object oItem = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItem))
{
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DARKNESS);
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DAMNING_DARKNESS);
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DEEPER_DARKNESS);
oItem = GetNextItemInInventory(oPC);
}
// Also check equipped items
int i;
for(i = 0; i < NUM_INVENTORY_SLOTS; i++)
{
oItem = GetItemInSlot(i, oPC);
if(GetIsObjectValid(oItem))
{
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DARKNESS);
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DAMNING_DARKNESS);
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DEEPER_DARKNESS);
}
}
/* Left here in case the multisummon trick is ever broken. In that case, use this to make Astral Constructs get unsummoned properly /* Left here in case the multisummon trick is ever broken. In that case, use this to make Astral Constructs get unsummoned properly
if(GetHasFeat(whatever feat determines if the PC can manifest Astral Construct here)){ if(GetHasFeat(whatever feat determines if the PC can manifest Astral Construct here)){
int i = 1; int i = 1;

View File

@@ -225,6 +225,10 @@ void DoWeaponUnequip(object oPC, object oItem)
} }
} }
// Clear OTWF bonuses
SetCompositeAttackBonus(oPC, "OTWFL", 0, ATTACK_BONUS_OFFHAND);
SetCompositeAttackBonus(oPC, "OTWFR", 0, ATTACK_BONUS_ONHAND);
// if(DEBUG) DoDebug("prc_restwpnsize - OnUnEquip"); // <-script no longer exists // if(DEBUG) DoDebug("prc_restwpnsize - OnUnEquip"); // <-script no longer exists
// remove any TWF penalties // remove any TWF penalties

View File

@@ -9,6 +9,10 @@
Modified: June 12, 2006 Modified: June 12, 2006
Flaming_Sword: Added touch attack roll Flaming_Sword: Added touch attack roll
Fixed by: Jaysyn
Date: 2026-05-26 19:53:19
*/ */
#include "prc_sp_func" #include "prc_sp_func"
@@ -53,54 +57,75 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel)
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS"); object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel); SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
} }
else else
{ {
object oItemTarget = oTarget; object oItemTarget = oTarget;
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
{ //touch attack roll if target creature is not an ally if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
// ally = friendly or party member { //touch attack roll if target creature is not an ally
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster)) if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
iAttackRoll = PRCDoMeleeTouchAttack(oTarget); iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
if(iAttackRoll > 0) if(iAttackRoll > 0)
{ {
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget); oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
if(!GetIsObjectValid(oItemTarget)) if(DEBUG) DoDebug("Darkness: Chest item = " + DebugObject2Str(oItemTarget));
{ if(!GetIsObjectValid(oItemTarget))
//no armor, check other slots {
int i; //no armor, check other slots
for(i=0;i<14;i++) int i;
{ for(i=0;i<14;i++)
oItemTarget = GetItemInSlot(i, oTarget); {
if(GetIsObjectValid(oItemTarget)) oItemTarget = GetItemInSlot(i, oTarget);
break;//end for loop if(GetIsObjectValid(oItemTarget))
} {
} if(DEBUG) DoDebug("Darkness: Found item in slot " + IntToString(i));
} break;//end for loop
} }
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE) }
{ }
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, fDuration, TRUE, -1, nCasterLevel);
// Apply item property if valid item found
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS"); if(GetIsObjectValid(oItemTarget))
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel); {
} if(DEBUG) DoDebug("Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
// If nothing is valid itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel);
else if (!GetIsObjectValid(oItemTarget) && !GetIsObjectValid(oItemTarget)) IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
{ if(DEBUG) DoDebug("Darkness: IP applied");
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration); DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
}
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS"); // 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); SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
} }
else // Ground casting or creatures with no equipment - location-based AOE
{ else if(GetObjectType(oTarget) != OBJECT_TYPE_CREATURE || !GetIsObjectValid(oItemTarget))
//otherwise items get an IP {
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
//this applies the effects relating to it object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID)); 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 return iAttackRoll; //return TRUE if spell charges should be decremented

View File

@@ -30,7 +30,11 @@ Arcane Material Component: A dollop of pitch with a
tiny needle hidden inside it. tiny needle hidden inside it.
Author: Tenjac Author: Tenjac
Created: Created:
Fixed by: Jaysyn
Date: 2026-05-26 19:53:19
*/ */
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
@@ -46,108 +50,135 @@ Created:
// eg. touch attack hits // eg. touch attack hits
// //
// Variables passed may be changed if necessary // Variables passed may be changed if necessary
int DoSpell(object oCaster, object oTarget, int nCasterLevel) int DoSpell(object oCaster, object oTarget, int nCasterLevel)
{ {
//Declare major variables including Area of Effect Object //Declare major variables including Area of Effect Object
int iAttackRoll = 1; int iAttackRoll = 1;
int nMetaMagic = PRCGetMetaMagicFeat(); int nMetaMagic = PRCGetMetaMagicFeat();
int nPnP = GetPRCSwitch(PRC_PNP_DARKNESS); int nPnP = GetPRCSwitch(PRC_PNP_DARKNESS);
float fDuration = nPnP ? TurnsToSeconds(nCasterLevel * 10) : RoundsToSeconds(nCasterLevel);//10min/level for PnP float fDuration = nPnP ? TurnsToSeconds(nCasterLevel * 10) : RoundsToSeconds(nCasterLevel);//10min/level for PnP
effect eAOE = EffectAreaOfEffect(AOE_PER_DAMNDARK); effect eAOE = EffectAreaOfEffect(AOE_PER_DAMNDARK);
//Make sure duration does no equal 0 //Make sure duration does no equal 0
if(fDuration < 6.0f) if(fDuration < 6.0f)
fDuration = 6.0f; fDuration = 6.0f;
//Check Extend metamagic feat. //Check Extend metamagic feat.
if(nMetaMagic & METAMAGIC_EXTEND) if(nMetaMagic & METAMAGIC_EXTEND)
fDuration *= 2; fDuration *= 2;
if(!nPnP) int nShadow = PRCMax(GetLocalInt(oCaster, "ShadowMantle_Shoulder"), GetLocalInt(oTarget, "ShadowMantle_Shoulder"));
{ if (nShadow) nPnP = FALSE;
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration); if (DEBUG) DoDebug("sp_damng_dark: oCaster "+GetName(oCaster)+" oTarget "+GetName(oTarget)+" nSwitch "+IntToString(nPnP));
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK"); if(!nPnP)
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel); {
} if (nShadow)
else ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oCaster, fDuration);
{ else
object oItemTarget = oTarget; ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
{ //touch attack roll if target creature is not an ally object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
// ally = friendly or party member SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster)) }
iAttackRoll = PRCDoMeleeTouchAttack(oTarget); else
{
if(iAttackRoll > 0) object oItemTarget = oTarget;
{
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget); if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
if(!GetIsObjectValid(oItemTarget)) { //touch attack roll if target creature is not an ally
{ if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
//no armor, check other slots iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
int i;
for(i=0;i<14;i++) if(iAttackRoll > 0)
{ {
oItemTarget = GetItemInSlot(i, oTarget); oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
if(GetIsObjectValid(oItemTarget)) if(DEBUG) DoDebug("Damning Darkness: Chest item = " + DebugObject2Str(oItemTarget));
break;//end for loop if(!GetIsObjectValid(oItemTarget))
} {
} //no armor, check other slots
} int i;
} for(i=0;i<14;i++)
{
if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE || !GetIsObjectValid(oItemTarget)) oItemTarget = GetItemInSlot(i, oTarget);
{ if(GetIsObjectValid(oItemTarget))
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, fDuration, TRUE, -1, nCasterLevel); {
if(DEBUG) DoDebug("Damning Darkness: Found item in slot " + IntToString(i));
object oAoE = GetAreaOfEffectObject(GetLocation(oTarget), "AOE_PER_DAMNDARK"); break;//end for loop
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel); }
} }
// If nothing is valid }
else if (!GetIsObjectValid(oItemTarget) && !GetIsObjectValid(oItemTarget))
{ // Apply item property if valid item found
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration); if(GetIsObjectValid(oItemTarget))
{
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "AOE_PER_DAMNDARK"); if(DEBUG) DoDebug("Damning Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel); 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 return iAttackRoll; //return TRUE if spell charges should be decremented
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DAMNING_DARKNESS, nCasterLevel); }
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
//this applies the effects relating to it void main()
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID)); {
} if(!X2PreSpellCastCode()) return;
} PRCSetSchool(SPELL_SCHOOL_EVOCATION);
object oCaster = OBJECT_SELF;
return iAttackRoll; //return TRUE if spell charges should be decremented object oTarget = PRCGetSpellTargetObject();
} int nCasterLevel = PRCGetCasterLevel(oCaster);
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags
void main() if(!nEvent) //normal cast
{ {
if(!X2PreSpellCastCode()) return; if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
PRCSetSchool(SPELL_SCHOOL_EVOCATION); { //holding the charge, casting spell on self
object oCaster = OBJECT_SELF; SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges
object oTarget = PRCGetSpellTargetObject(); return;
int nCasterLevel = PRCGetCasterLevel(oCaster); }
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags DoSpell(oCaster, oTarget, nCasterLevel);
if(!nEvent) //normal cast }
{ else
if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget) {
{ //holding the charge, casting spell on self if(nEvent & PRC_SPELL_EVENT_ATTACK)
SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges {
return; if(DoSpell(oCaster, oTarget, nCasterLevel))
} DecrementSpellCharges(oCaster);
DoSpell(oCaster, oTarget, nCasterLevel); }
} }
else PRCSetSchool();
{
if(nEvent & PRC_SPELL_EVENT_ATTACK)
{
if(DoSpell(oCaster, oTarget, nCasterLevel))
DecrementSpellCharges(oCaster);
}
}
PRCSetSchool();
} }

View File

@@ -1,6 +1,6 @@
//:://///////////////////////////////////////////// //::///////////////////////////////////////////////
//:: Name Damning Darkness //:: Name Damning Darkness
//:: FileName sp_damng_dark.nss //:: FileName sp_damng_darka.nss
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
/**@file Damning Darkness /**@file Damning Darkness
Evocation [Darkness, Evil] Evocation [Darkness, Evil]
@@ -31,55 +31,116 @@ tiny needle hidden inside it.
Author: Tenjac Author: Tenjac
Created: 6/12/06 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_alterations"
#include "prc_inc_spells" #include "prc_inc_spells"
void main() void DarkLoop(object oTarget, object oPC, int nMetaMagic);
{
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
void main()
object oTarget = GetEnteringObject(); {
object oPC = GetAreaOfEffectCreator(); PRCSetSchool(SPELL_SCHOOL_EVOCATION);
int nMetaMagic = PRCGetMetaMagicFeat();
int nCasterLvl = PRCGetCasterLevel(oPC); int nMetaMagic = PRCGetMetaMagicFeat();
effect eDark = EffectDarkness(); effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); effect eDark = EffectDarkness();
effect eLink = EffectLinkEffects(eDark, eDur); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, (600.0f * nCasterLvl));
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); else if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_NEUTRAL)
{
PRCSetSchool(); int nDam = PRCMaximizeOrEmpower(6, 1, nMetaMagic) + SpellDamagePerDice(oPC, 1);
} SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_DIVINE), oTarget);
}
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
DelayCommand(6.0f, DarkLoop(oTarget, oPC)); {
// Evil creatures take no damage
}
}
DelayCommand(6.0f, DarkLoop(oTarget, oPC, nMetaMagic));
} }

View File

@@ -31,41 +31,47 @@ tiny needle hidden inside it.
Author: Tenjac Author: Tenjac
Created: Created:
Fixed by: Jaysyn
Date: 2026-05-26 19:53:19
*/ */
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
#include "prc_alterations"
#include "prc_alterations" #include "prc_inc_spells"
#include "prc_inc_spells"
void main()
void main() {
{ PRCSetSchool(SPELL_SCHOOL_EVOCATION);
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
object oTarget = GetExitingObject();
//Declare major variables object oPC = GetAreaOfEffectCreator();
//Get the object that is exiting the AOE effect eAOE;
object oTarget = GetExitingObject();
effect eAOE; // Clear the in-AOE marker to stop damage tracking
if(GetHasSpellEffect(SPELL_DAMNING_DARKNESS, oTarget)) DeleteLocalInt(oTarget, "PRC_DamningDarkness_InAOE");
{
//Search through the valid effects on the target. if(GetHasSpellEffect(SPELL_DAMNING_DARKNESS, oTarget))
eAOE = GetFirstEffect(oTarget); {
while (GetIsEffectValid(eAOE)) //Search through the valid effects on the target.
{ eAOE = GetFirstEffect(oTarget);
if (GetEffectCreator(eAOE) == GetAreaOfEffectCreator()) while (GetIsEffectValid(eAOE))
{ {
if(GetEffectType(eAOE) == EFFECT_TYPE_DARKNESS) if (GetEffectCreator(eAOE) == oPC)
{ {
//If the effect was created by CotA then remove it if(GetEffectType(eAOE) == EFFECT_TYPE_DARKNESS)
if(GetEffectSpellId(eAOE) == SPELL_DAMNING_DARKNESS) {
{ //If the effect was created by Damning Darkness then remove it
RemoveEffect(oTarget, eAOE); if(GetEffectSpellId(eAOE) == SPELL_DAMNING_DARKNESS)
} {
} RemoveEffect(oTarget, eAOE);
} }
//Get next effect on the target }
eAOE = GetNextEffect(oTarget); }
} //Get next effect on the target
} eAOE = GetNextEffect(oTarget);
PRCSetSchool(); }
}
PRCSetSchool();
} }

View File

@@ -7347,7 +7347,7 @@ You make yourself - including clothing, armor, weapons and equipment - look diff
<entry id="45448" lang="en" sex="m">Disguise Self, Normal Form</entry> <entry id="45448" lang="en" sex="m">Disguise Self, Normal Form</entry>
<entry id="45449" lang="en" sex="m">Attune Gem</entry> <entry id="45449" lang="en" sex="m">Attune Gem</entry>
<entry id="45450" lang="en" sex="m">Type of Feat: Item Creation <entry id="45450" lang="en" sex="m">Type of Feat: Item Creation
Prerequisite: Intelligence 13, Arcane Spells level 3. Prerequisite: Intelligence 13, Craft (General) 1, Arcane Spells level 3.
Specifics: You can cast any arcane spell you have prepared as a gem. The caster must have the spell memorized to be able to create the gem. Crafting a gem costs Spell level * Caster level * 50 in gold pieces for a normal caster (half base cost). It also takes XP equal to 1/25th of the base cost. If you cannot pay the casting cost or the XP loss would drop you a level, the crafting will fail, and the spell will be lost. Crafting the gem requires a gem with a value of 50gp * spell level. A gem is permanent until used. Gems target those who activate them. Specifics: You can cast any arcane spell you have prepared as a gem. The caster must have the spell memorized to be able to create the gem. Crafting a gem costs Spell level * Caster level * 50 in gold pieces for a normal caster (half base cost). It also takes XP equal to 1/25th of the base cost. If you cannot pay the casting cost or the XP loss would drop you a level, the crafting will fail, and the spell will be lost. Crafting the gem requires a gem with a value of 50gp * spell level. A gem is permanent until used. Gems target those who activate them.
Use: Selected.</entry> Use: Selected.</entry>
<entry id="45451" lang="en" sex="m">Epic Scout</entry> <entry id="45451" lang="en" sex="m">Epic Scout</entry>
@@ -27344,7 +27344,7 @@ Save: Will negates
Spell Resistance: Yes Spell Resistance: Yes
This spell calms agitated creatures. You have no control over the affected creatures, but Calm Emotions can stop raging creatures from fighting or joyous ones from reveling. Creatures so affected cannot take violent actions (although they can defend themselves) or do anything destructive. Any aggressive action against or damage dealt to a calmed creature immediately breaks the spell on all calmed creatures. This spell calms agitated creatures. You have no control over the affected creatures, but Calm Emotions can stop raging creatures from fighting or joyous ones from reveling. Creatures so affected cannot take violent actions (although they can defend themselves) or do anything destructive. Any aggressive action against or damage dealt to a calmed creature immediately breaks the spell on all calmed creatures.
This spell automatically suppresses any morale bonuses granted by spells such as Bless, Good Hope and Rage, as well as negating a Bard's ability to inspire courage or a Barbarian's rage ability. It also suppresses any feat effects and removes the Confused condition from all targets.</entry> This spell automatically suppresses any morale bonuses granted by spells such as Bless, Good Hope and Rage, as well as negating a Bard's ability to inspire courage or a Barbarian's rage ability. It also suppresses any fear effects and removes the Confused condition from all targets.</entry>
<entry id="51124" lang="en" sex="m">Repulsion</entry> <entry id="51124" lang="en" sex="m">Repulsion</entry>
<entry id="51125" lang="en" sex="m">School: Abjuration <entry id="51125" lang="en" sex="m">School: Abjuration
Level: Cleric/Healer 7, Sorcerer/Wizard 6 Level: Cleric/Healer 7, Sorcerer/Wizard 6