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:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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!!! */
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
Binary file not shown.
@@ -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
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user