diff --git a/PRC8_ChangeLog.txt b/PRC8_ChangeLog.txt
index f5e97b2e..2cddaf11 100644
--- a/PRC8_ChangeLog.txt
+++ b/PRC8_ChangeLog.txt
@@ -1,3 +1,23 @@
+Commit: Jaysyn904
+Date: Thur May 28
+
+Updated damagtypes.2da for CEP3 reserved rows.
+Added and setup Darkvision icon.
+Added and setup Ultravision icon.
+Added spell icon for Thicket of Blades.
+Fixed Blacklight, Cloud of the Archeai, Darkness, Deeper Darkness, Damning Darkness, Utterdark, Grasping Shadows, Dawn and Dusk and Child of Shadow and Light for Telflammar Shadowlord's Shadow Blur and Shadow Sight abilities.
+Updated Blacklight's TLK entry.
+Created a constant for Shadow Discorporation.
+Fixed Shadow Time never ending on the targets.
+Updated prc_inc_combat to use monk iterative progression if warranted.
+Updated PRCGetIsRealSpellKnownByClass() to handle Sublime Chord better. (@Lightbeard)
+Added class heartbeat script for Shadowlord to handle Shadow Blur and Shadow Sight.
+Added ShadowlordEffects() to prc_inc_spells.
+Added constants for new damagetypes.
+Completely rewrote Verminlord's Vermin Domination.
+Fixed duration for Empathic Feedback.
+Fixed Morality Undone to not break characters over a server reset.
+
Commit: Jaysyn904
Date: Weds May 27
diff --git a/nwn/nwnprc/trunk/2das/damagehitvisual.2da b/nwn/nwnprc/trunk/2das/damagehitvisual.2da
index 6ee3010e..15a3d0a6 100644
--- a/nwn/nwnprc/trunk/2das/damagehitvisual.2da
+++ b/nwn/nwnprc/trunk/2das/damagehitvisual.2da
@@ -23,3 +23,9 @@
19 Force 282 ****
20 Untyped 288 ****
21 Vile 84 ****
+22 Sanctified 289 ****
+23 Holy 289 ****
+24 Unholy 288 ****
+25 Falling **** ****
+26 Ballistic **** ****
+27 Dessication 84 ****
diff --git a/nwn/nwnprc/trunk/2das/damagetypegroups.2da b/nwn/nwnprc/trunk/2das/damagetypegroups.2da
index c12704c6..032816cf 100644
--- a/nwn/nwnprc/trunk/2das/damagetypegroups.2da
+++ b/nwn/nwnprc/trunk/2das/damagetypegroups.2da
@@ -1,22 +1,28 @@
2DA V2.0
- Label FeedbackStrref ColorR ColorG ColorB
-0 Physical 5594 **** **** ****
-1 Magical 5593 204 119 255
-2 Acid 10458 0 102 0
-3 Cold 10459 153 255 255
-4 Divine 10460 255 255 0
-5 Electrical 10461 0 102 255
-6 Fire 10462 235 141 0
-7 Negative 10463 110 3 3
-8 Positive 10464 176 4 159
-9 Sonic 10465 120 120 120
-10 **** **** **** **** ****
-11 Poison 16820375 64 255 54
-12 **** **** **** **** ****
-13 Psychic 16820377 133 14 135
-14 **** **** **** **** ****
-15 Radiant 16820379 227 191 9
-16 Force 16820380 15 209 183
-17 Untyped 16820354 250 250 250
-18 Vile 16820357 185 32 38
+ Label FeedbackStrref ColorR ColorG ColorB
+0 Physical 5594 **** **** ****
+1 Magical 5593 204 119 255
+2 Acid 10458 0 102 0
+3 Cold 10459 153 255 255
+4 Divine 10460 255 255 0
+5 Electrical 10461 0 102 255
+6 Fire 10462 235 141 0
+7 Negative 10463 110 3 3
+8 Positive 10464 176 4 159
+9 Sonic 10465 120 120 120
+10 CEP3_RESERVED **** **** **** ****
+11 Poison 16820375 64 255 54
+12 CEP3_RESERVED **** **** **** ****
+13 Psychic 16820377 133 14 135
+14 CEP3_RESERVED **** **** **** ****
+15 Radiant 16820379 227 191 9
+16 Force 16820380 95 158 160
+17 Untyped 16820354 250 250 250
+18 Vile 16820357 185 32 38
+19 Sanctified 16820336 255 215 0
+20 Holy 16820339 250 250 210
+21 Unholy 16820342 128 0 128
+22 Falling 16820345 122 0 0
+23 Ballistic 16820348 128 128 128
+24 Dessication 16820351 139 69 19
diff --git a/nwn/nwnprc/trunk/2das/damagetypes.2da b/nwn/nwnprc/trunk/2das/damagetypes.2da
index 25b29934..9eff8bdc 100644
--- a/nwn/nwnprc/trunk/2das/damagetypes.2da
+++ b/nwn/nwnprc/trunk/2das/damagetypes.2da
@@ -1,26 +1,31 @@
2DA V2.0
- Label CharsheetStrref DamageTypeGroup
-0 Bludgeoning 58345 0
-1 Piercing 58341 0
-2 Slashing 58344 0
-3 Magical 58302 1
-4 Acid 58303 2
-5 Cold 58304 3
-6 Divine 58305 4
-7 Electrical 58306 5
-8 Fire 58308 6
-9 Negative 58309 7
-10 Positive 58310 8
-11 Sonic 58311 9
-12 Base 58301 0
-13 CEP3_RESERVED **** ****
-14 Poison 16820368 11
-15 CEP3_RESERVED **** ****
-16 Psychic 16820370 13
-17 CEP3_RESERVED **** ****
-18 Radiant 16820372 15
-19 Force 16820373 16
-20 Untyped 16820355 17
-21 Vile 16820358 18
-22 **** **** ****
+ Label CharsheetStrref DamageTypeGroup
+0 Bludgeoning 58345 0
+1 Piercing 58341 0
+2 Slashing 58344 0
+3 Magical 58302 1
+4 Acid 58303 2
+5 Cold 58304 3
+6 Divine 58305 4
+7 Electrical 58306 5
+8 Fire 58308 6
+9 Negative 58309 7
+10 Positive 58310 8
+11 Sonic 58311 9
+12 Base 58301 0
+13 CEP3_RESERVED **** ****
+14 Poison 16820368 11
+15 CEP3_RESERVED **** ****
+16 Psychic 16820370 13
+17 CEP3_RESERVED **** ****
+18 Radiant 16820372 15
+19 Force 16820373 16
+20 Untyped 16820355 17
+21 Vile 16820358 18
+22 Sanctified 16820337 19
+23 Holy 16820340 20
+24 Unholy 16820343 21
+25 Falling 16820346 22
+26 Ballistic 16820349 23
+27 Dessication 16820352 24
diff --git a/nwn/nwnprc/trunk/2das/des_crft_scroll.2da b/nwn/nwnprc/trunk/2das/des_crft_scroll.2da
index 0451e507..203f8129 100644
--- a/nwn/nwnprc/trunk/2das/des_crft_scroll.2da
+++ b/nwn/nwnprc/trunk/2das/des_crft_scroll.2da
@@ -2248,7 +2248,7 @@
2244 Dragon_Breath_Prismatic **** **** **** **** **** ****
2245 ManyShot **** **** **** **** **** ****
2246 ManyShot2 **** **** **** **** **** ****
-2247 Magic_Missile prc_scr_1127 **** **** **** **** ****
+2247 Major_Missile prc_scr_1127 **** **** **** **** ****
2248 ManyShot4 **** **** **** **** **** ****
2249 ManyShot6 **** **** **** **** **** ****
2250 Examine_Recipe **** **** **** **** **** ****
diff --git a/nwn/nwnprc/trunk/2das/des_crft_spells.2da b/nwn/nwnprc/trunk/2das/des_crft_spells.2da
index a8272c4d..4aefbda5 100644
--- a/nwn/nwnprc/trunk/2das/des_crft_spells.2da
+++ b/nwn/nwnprc/trunk/2das/des_crft_spells.2da
@@ -2248,7 +2248,7 @@
2244 Dragon_Breath_Prismatic **** 1 1 1 9 0
2245 ManyShot **** 1 1 1 1 0
2246 ManyShot2 **** 1 1 1 1 0
-2247 Magic_Missile 1127 1 1 0 5 0
+2247 Major_Missile 1127 1 1 0 5 0
2248 ManyShot4 **** 1 1 1 1 0
2249 ManyShot6 **** 1 1 1 1 0
2250 Examine_Recipe **** 1 1 1 1 0
diff --git a/nwn/nwnprc/trunk/2das/iprp_damagetype.2da b/nwn/nwnprc/trunk/2das/iprp_damagetype.2da
index d974c1b5..04c2e5ac 100644
--- a/nwn/nwnprc/trunk/2das/iprp_damagetype.2da
+++ b/nwn/nwnprc/trunk/2das/iprp_damagetype.2da
@@ -25,3 +25,9 @@
21 16820366 Force 0.55 28
22 16820354 Untyped 0.55 8
23 16820357 Vile 0.55 9
+24 16820336 Sanctified 0.55 5
+25 16820339 Holy 0.55 5
+26 16820342 Unholy 0.55 9
+27 16820345 Falling 0.55 ****
+28 16820348 Ballistic 0.55 ****
+29 16820351 Dessication 0.55 6
diff --git a/nwn/nwnprc/trunk/2das/spells.2da b/nwn/nwnprc/trunk/2das/spells.2da
index ea297a9d..7fc12773 100644
--- a/nwn/nwnprc/trunk/2das/spells.2da
+++ b/nwn/nwnprc/trunk/2das/spells.2da
@@ -2248,7 +2248,7 @@
2244 Dragon_Breath_Prismatic 84513 is_PrisSpray V S vs 0x00 0x3e inidra_dragpris **** **** **** **** **** **** 9 2000 head **** **** **** **** **** **** out 3000 **** var_conepris **** sar_conepris 0 **** **** **** **** **** Mind-Affecting 1 **** **** **** **** **** 11 **** 2 84515 1 0 84514 1 **** **** **** 1 cone 20 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2245 ManyShot 16826084 **** V S 0 0x00 0x3a ft_manyshot **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** attack 1000 **** **** **** **** 1 wamar_001 ballistic hand **** path **** 0 2246 2248 2249 **** **** 2 **** 3 16826085 0 0 **** 1 3306 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2246 ManyShot2 16826013 ife_wepspec_Lbw V S 0 0x00 0x3e ft_manyshot **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** attack 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** 2245 3 **** 0 0 **** 1 525208810 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
-2247 Magic_Missile 16826070 is_MagMiss V L vs 0x3d 0x3A sp_mjmagmiss **** **** **** **** **** 5 5 1500 hand **** vco_mehancold03 **** sco_mehancold03 vs_chant_evoc_lm vs_chant_evoc_lf out 1000 **** vca_outsonic **** sca_outsonic 0 **** **** **** **** path **** 1 **** **** **** **** **** 2 **** 1 16826071 1 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
+2247 Major_Missile 16826070 is_MagMiss V L vs 0x3d 0x3A sp_mjmagmiss **** **** **** **** **** 5 5 1500 hand **** vco_mehancold03 **** sco_mehancold03 vs_chant_evoc_lm vs_chant_evoc_lf out 1000 **** vca_outsonic **** sca_outsonic 0 **** **** **** **** path **** 1 **** **** **** **** **** 2 **** 1 16826071 1 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2248 ManyShot4 16826014 ife_wepspec_Lbw V S 0 0x00 0x3e ft_manyshot **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** attack 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** 2245 3 **** 0 0 **** 1 525274346 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2249 ManyShot6 16826015 ife_wepspec_Lbw V S 0 0x00 0x3e ft_manyshot **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** attack 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** 2245 3 **** 0 0 **** 1 525339882 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2250 Examine_Recipe 16824431 is_divine G P vs 0x3a 0x08 prccraft_read **** **** **** **** **** **** 1 1500 hand **** **** **** **** **** **** out 0 **** **** **** **** 0 **** **** **** **** **** **** 0 2254 2255 **** **** **** **** **** 4 16824432 1 0 **** 0 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
@@ -19342,7 +19342,7 @@
19338 RethDekala_RecoverManeuver 16790298 ife_mastelem T P 0 **** 0x01 tob_gen_recover **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 3 **** 0 0 **** 0 **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
19339 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
19340 Shadow_Conjuration_Conversation 16790387 is_ShadConj I P s **** 0x01 shdconj_convrun **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 24732 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
-19341 PNP_SHADES 908 is_Shades I S vs 0x00 0x2F **** **** **** **** **** **** 9 9 **** **** **** **** **** **** vs_chant_illu_hm vs_chant_illu_hf **** **** **** **** **** **** **** **** **** **** **** **** **** 0 19342 19343 19344 19345 19346 **** **** 4 6251 1 0 **** 1 24733 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
+19341 PNP_SHADES 908 is_Shades I S vs 0x00 0x2F **** **** **** **** **** **** **** 9 **** **** **** **** **** **** vs_chant_illu_hm vs_chant_illu_hf **** **** **** **** **** **** **** **** **** **** **** **** **** 0 19342 19343 19344 19345 19346 **** **** 4 6251 1 0 **** 1 24733 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
19342 PNP_SHADES_QS1 16790382 is_Shades I S s **** 0x3F prc_shdconj_quik **** **** **** **** **** **** 9 1500 **** **** **** **** **** vs_chant_illu_hm vs_chant_illu_hf **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 11 19341 1 **** 1 0 **** 1 436887709 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
19343 PNP_SHADES_QS2 16790383 is_Shades I S s **** 0x3F prc_shdconj_quik **** **** **** **** **** **** 9 1500 **** **** **** **** **** vs_chant_illu_hm vs_chant_illu_hf **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 11 19341 1 **** 1 0 **** 1 436953245 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
19344 PNP_SHADES_QS3 16790384 is_Shades I S s **** 0x3F prc_shdconj_quik **** **** **** **** **** **** 9 1500 **** **** **** **** **** vs_chant_illu_hm vs_chant_illu_hf **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 11 19341 1 **** 1 0 **** 1 437018781 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
diff --git a/nwn/nwnprc/trunk/include/bnd_inc_bndfunc.nss b/nwn/nwnprc/trunk/include/bnd_inc_bndfunc.nss
index ec533de0..0fce7ed3 100644
--- a/nwn/nwnprc/trunk/include/bnd_inc_bndfunc.nss
+++ b/nwn/nwnprc/trunk/include/bnd_inc_bndfunc.nss
@@ -362,6 +362,17 @@ string GetBindingClassFile(int nClass)
void ApplyVestige(object oBinder, int nVestige)
{
+ //:: Remove Astaroth's crafting feat to allow leveling up.
+ effect eOld = GetFirstEffect(oBinder);
+ while (GetIsEffectValid(eOld))
+ {
+ if (GetEffectTag(eOld) == "AstarothCraftingFeat")
+ {
+ RemoveEffect(oBinder, eOld);
+ }
+ eOld = GetNextEffect(oBinder);
+ }
+
PRCRemoveSpellEffects(nVestige, oBinder, oBinder);
GZPRCRemoveSpellEffects(nVestige, oBinder, FALSE);
ActionCastSpellOnSelf(nVestige, METAMAGIC_NONE, oBinder);
@@ -393,7 +404,18 @@ void ApplyVestige(object oBinder, int nVestige)
void ExpelVestige(object oBinder, int nVestige)
{
- SetPersistantLocalInt(oBinder, "ExpelledVestige", TRUE);
+ //:: Remove Astaroth's crafting feat to allow leveling up.
+ effect eOld = GetFirstEffect(oBinder);
+ while (GetIsEffectValid(eOld))
+ {
+ if (GetEffectTag(eOld) == "AstarothCraftingFeat")
+ {
+ RemoveEffect(oBinder, eOld);
+ }
+ eOld = GetNextEffect(oBinder);
+ }
+
+ SetPersistantLocalInt(oBinder, "ExpelledVestige", TRUE);
SetPersistantLocalInt(oBinder, "ExpelledVestige"+IntToString(nVestige), TRUE);
// Here, making a good pack means we can unbind it
if (GetLocalInt(oBinder, "PactQuality"+IntToString(nVestige)))
@@ -965,4 +987,6 @@ int GetPatronVestige(object oBinder)
else if (GetHasFeat(FEAT_PATRON_VESTIGE_ABYSM , oBinder)) nPatron = VESTIGE_ABYSM;
return nPatron;
-}
\ No newline at end of file
+}
+
+//:: void main(){}
diff --git a/nwn/nwnprc/trunk/include/inv_inc_invfunc.nss b/nwn/nwnprc/trunk/include/inv_inc_invfunc.nss
index ba509358..57f18801 100644
--- a/nwn/nwnprc/trunk/include/inv_inc_invfunc.nss
+++ b/nwn/nwnprc/trunk/include/inv_inc_invfunc.nss
@@ -465,7 +465,7 @@ int GetInvokerLevel(object oInvoker = OBJECT_SELF, int nSpecificClass = CLASS_TY
if(nLevel)
{
if(DEBUG) SendMessageToPC(oInvoker, "Forced-level Invoking at level " + IntToString(GetCasterLevel(oInvoker)));
- //DelayCommand(1.0, DeleteLocalInt(oInvoker, PRC_CASTERLEVEL_OVERRIDE));
+ DelayCommand(1.0, DeleteLocalInt(oInvoker, PRC_CASTERLEVEL_OVERRIDE));
return nLevel + nAdjust;
}
diff --git a/nwn/nwnprc/trunk/include/prc_inc_spells.nss b/nwn/nwnprc/trunk/include/prc_inc_spells.nss
index 37278892..fa632dfa 100644
--- a/nwn/nwnprc/trunk/include/prc_inc_spells.nss
+++ b/nwn/nwnprc/trunk/include/prc_inc_spells.nss
@@ -2671,7 +2671,7 @@ void DoPiercingCold(object oCaster, object oTarget, int nDamageAmount, int nCurr
if (nDamageAmount > nTest)
{
// Apply the difference to ignore resist
- effect eDam = EffectDamage(nDamageAmount - nTest, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_ENERGY);
+ effect eDam = EffectDamage(nDamageAmount - nTest, DAMAGE_TYPE_UNTYPED, DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
effect eVis = EffectVisualEffect(VFX_IMP_FROST_L);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
@@ -2786,13 +2786,13 @@ effect PRCEffectDamage(object oTarget, int nDamageAmount, int nDamageType=DAMAGE
{
int nDice = (iDiabolistLevel + 5) / 5;
int nDamage = d6(nDice);
- int nDamageType = DAMAGE_TYPE_DIVINE;
+ int nDamageType = DAMAGE_TYPE_UNHOLY;
if(GetLocalInt(oCaster, "VileDiabolism"))
{
//FloatingTextStringOnCreature("Vile Diabolism is active", oCaster, FALSE);
nDamage /= 2;
- nDamageType = DAMAGE_TYPE_POSITIVE;
+ nDamageType = DAMAGE_TYPE_VILE;
DeleteLocalInt(oCaster, "VileDiabolism");
}
diff --git a/nwn/nwnprc/trunk/include/prc_ipfeat_const.nss b/nwn/nwnprc/trunk/include/prc_ipfeat_const.nss
index 1f644d36..16ccc697 100644
--- a/nwn/nwnprc/trunk/include/prc_ipfeat_const.nss
+++ b/nwn/nwnprc/trunk/include/prc_ipfeat_const.nss
@@ -900,14 +900,16 @@ const int IP_CONST_ONHIT_SAVEDC_70 = 70;
// Creature Epic Criticals
const int IP_CONST_FEAT_DEVCRITICAL_CREATURE = 271;
const int IP_CONST_FEAT_OVERCRITICAL_CREATURE = 272;
-//const int IP_CONST_FEAT_WEAPON_PROF_CREATURE = 38; // provided by Bioware in 1.66
// Epic DR
const int IP_CONST_FEAT_EPIC_DR_3 = 273;
const int IP_CONST_FEAT_EPIC_DR_6 = 274;
const int IP_CONST_FEAT_EPIC_DR_9 = 275;
-//IP_CONST_DAMAGETYPE
+//:://////////////////////////////////////////////
+//:: New damage types (iprp_damagetype.2da)
+//:://////////////////////////////////////////////
+
//const int IP_CONST_DAMAGETYPE_BLOOD = 15; //:: Not a 3e PnP damage type
const int IP_CONST_DAMAGETYPE_POISON = 16;
//const int IP_CONST_DAMAGETYPE_SHADOW = 17; //:: Not a 3e PnP damage type
@@ -917,6 +919,12 @@ const int IP_CONST_DAMAGETYPE_RADIANT = 20;
const int IP_CONST_DAMAGETYPE_FORCE = 21;
const int IP_CONST_DAMAGETYPE_UNTYPED = 22;
const int IP_CONST_DAMAGETYPE_VILE = 23;
+const int IP_CONST_DAMAGETYPE_SANCTIFIED = 24;
+const int IP_CONST_DAMAGETYPE_HOLY = 25;
+const int IP_CONST_DAMAGETYPE_UNHOLY = 26;
+const int IP_CONST_DAMAGETYPE_FALLING = 27;
+const int IP_CONST_DAMAGETYPE_BALLISTIC = 28;
+const int IP_CONST_DAMAGETYPE_DESSICATION = 29;
//IP_CONST_DAMAGESOAK
const int IP_CONST_DAMAGESOAK_1_HP = 11;
diff --git a/nwn/nwnprc/trunk/include/prc_misc_const.nss b/nwn/nwnprc/trunk/include/prc_misc_const.nss
index 055f30d5..548b5759 100644
--- a/nwn/nwnprc/trunk/include/prc_misc_const.nss
+++ b/nwn/nwnprc/trunk/include/prc_misc_const.nss
@@ -13,12 +13,18 @@ const int EFFECT_ICON_ULTRAVISION = 131;
//:://////////////////////////////////////////////
//:: New damage types (damagetypes.2da)
//:://////////////////////////////////////////////
-const int DAMAGE_TYPE_POISON = 16384; // CUSTOM2
-const int DAMAGE_TYPE_PSYCHIC = 32768; // CUSTOM4
-const int DAMAGE_TYPE_RADIANT = 65536; // CUSTOM6
-const int DAMAGE_TYPE_FORCE = 524288; // CUSTOM7
-const int DAMAGE_TYPE_UNTYPED = 1048576; // CUSTOM8
-const int DAMAGE_TYPE_VILE = 2097152; // CUSTOM9
+const int DAMAGE_TYPE_POISON = 16384; // CUSTOM2
+const int DAMAGE_TYPE_PSYCHIC = 32768; // CUSTOM4
+const int DAMAGE_TYPE_RADIANT = 65536; // CUSTOM6
+const int DAMAGE_TYPE_FORCE = 524288; // CUSTOM7
+const int DAMAGE_TYPE_UNTYPED = 1048576; // CUSTOM8
+const int DAMAGE_TYPE_VILE = 2097152; // CUSTOM9
+const int DAMAGE_TYPE_SANCTIFIED = 4194304; // CUSTOM10
+const int DAMAGE_TYPE_HOLY = 8388608; // CUSTOM11
+const int DAMAGE_TYPE_UNHOLY = 16777216; // CUSTOM12
+const int DAMAGE_TYPE_FALLING = 33554432; // CUSTOM13
+const int DAMAGE_TYPE_BALLISTIC = 67108864; // CUSTOM14
+const int DAMAGE_TYPE_DESSICATION = 134217728; // CUSTOM15
//:://////////////////////////////////////////////
diff --git a/nwn/nwnprc/trunk/include/spinc_bolt.nss b/nwn/nwnprc/trunk/include/spinc_bolt.nss
index 03ed6da1..08f8b30f 100644
--- a/nwn/nwnprc/trunk/include/spinc_bolt.nss
+++ b/nwn/nwnprc/trunk/include/spinc_bolt.nss
@@ -214,7 +214,7 @@ float GetVFXLength(location lCaster, float fLength, float fAngle)
//:://////////////////////////////////////////////
//:: Modified March 14 2003: Removed the option to hurt chests/doors
//:: was potentially causing bugs when no creature targets available.
-void PRCDoMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MIRV, int nVIS = VFX_IMP_MAGBLUE, int nDAMAGETYPE = DAMAGE_TYPE_MAGICAL, int nONEHIT = FALSE, int nReflexSave = FALSE)
+void PRCDoMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MIRV, int nVIS = VFX_IMP_MAGBLUE, int nDAMAGETYPE = DAMAGE_TYPE_FORCE, int nONEHIT = FALSE, int nReflexSave = FALSE)
{
object oTarget = OBJECT_INVALID;
int nCasterLvl = PRCGetCasterLevel(OBJECT_SELF);
@@ -312,7 +312,7 @@ void PRCDoMissileStorm(int nD6Dice, int nCap, int nSpell, int nMIRV = VFX_IMP_MI
int i = 0;
//--------------------------------------------------------------
// GZ: Moved SR check out of loop to have 1 check per target
- // not one check per missile, which would rip spell mantels
+ // not one check per missile, which would rip spell mantles
// apart
//--------------------------------------------------------------
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,nCasterLvl, fDelay))
diff --git a/nwn/nwnprc/trunk/include/tob_inc_tobfunc.nss b/nwn/nwnprc/trunk/include/tob_inc_tobfunc.nss
index d3390820..be9905b4 100644
--- a/nwn/nwnprc/trunk/include/tob_inc_tobfunc.nss
+++ b/nwn/nwnprc/trunk/include/tob_inc_tobfunc.nss
@@ -49,6 +49,9 @@ const int MANEUVER_TYPE_MANEUVER = 5;
/* Function prototypes */
//////////////////////////////////////////////////
+int GetHasActiveStanceOfDiscipline(object oInitiator, int nDiscipline);
+
+
/**
* Determines from what class's maneuver list the currently being initiated
* maneuver is initiated from.
@@ -481,6 +484,34 @@ int _AllowedDiscipline(object oInitiator, int nClass, int nDiscipline)
/* Function definitions */
//////////////////////////////////////////////////
+int GetHasActiveStanceOfDiscipline(object oInitiator, int nDiscipline)
+{
+ int bHasDualStance = (GetLevelByClass(CLASS_TYPE_WARBLADE, oInitiator) >= 20) ||
+ (GetLevelByClass(CLASS_TYPE_MASTER_OF_NINE, oInitiator) >= 3 && GetLocalInt(oInitiator, "MoNDualStance"));
+
+ if (bHasDualStance)
+ {
+ // Check both stances for dual-stance characters
+ int nStance1 = GetLocalInt(oInitiator, "TOBStanceOne");
+ int nStance2 = GetLocalInt(oInitiator, "TOBStanceTwo");
+
+ if (nStance1 > 0 && GetDisciplineByManeuver(nStance1) == nDiscipline)
+ return TRUE;
+ if (nStance2 > 0 && GetDisciplineByManeuver(nStance2) == nDiscipline)
+ return TRUE;
+
+ return FALSE;
+ }
+ else
+ {
+ // Single stance check for normal characters
+ int nStance = GetHasActiveStance(oInitiator);
+ if (nStance != -1 && GetDisciplineByManeuver(nStance) == nDiscipline)
+ return TRUE;
+ return FALSE;
+ }
+}
+
int GetInitiatingClass(object oInitiator = OBJECT_SELF)
{
return GetLocalInt(oInitiator, PRC_INITIATING_CLASS) - 1;
diff --git a/nwn/nwnprc/trunk/newspellbook/bnd_bindingcnv.nss b/nwn/nwnprc/trunk/newspellbook/bnd_bindingcnv.nss
index e750ddbc..ed7620d7 100644
--- a/nwn/nwnprc/trunk/newspellbook/bnd_bindingcnv.nss
+++ b/nwn/nwnprc/trunk/newspellbook/bnd_bindingcnv.nss
@@ -443,7 +443,24 @@ void main()
ClearCurrentStage(oBinder);
MarkStageNotSetUp(STAGE_EXPLOIT_VESTIGE, oBinder);
}
- else if(nStage == STAGE_ASTAROTH)
+ else if(nStage == STAGE_ASTAROTH)
+ {
+ // Grant the selected crafting feat as a tagged effect
+ effect eFeat = EffectBonusFeat(nChoice);
+ eFeat = TagEffect(eFeat, "AstarothCraftingFeat");
+ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eFeat), oBinder, HoursToSeconds(24));
+
+ int nContactTime = VESTIGE_CONTACT_TIME;
+ if(GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER) >= 6) nContactTime = GetPRCSwitch(PRC_CONTACT_VESTIGE_TIMER);
+ ContactVestige(oBinder, nContactTime, GetLocalInt(oBinder, "nVestige"));
+ DeleteLocalInt(oBinder, "nVestige");
+ AllowExit(DYNCONV_EXIT_FORCE_EXIT);
+
+ ClearCurrentStage(oBinder);
+ MarkStageNotSetUp(STAGE_ASTAROTH, oBinder);
+ }
+
+/* else if(nStage == STAGE_ASTAROTH)
{
if (nChoice == FEAT_SCRIBE_SCROLL ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_SCRIBE_SCROLL ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
if (nChoice == FEAT_BREW_POTION ) IPSafeAddItemProperty(GetPCSkin(oBinder), ItemPropertyBonusFeat(IP_FEAT_FEAT_BREW_POTION ), HoursToSeconds(24), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
@@ -462,7 +479,7 @@ void main()
ClearCurrentStage(oBinder);
MarkStageNotSetUp(STAGE_ASTAROTH, oBinder);
- }
+ } */
if(DEBUG) DoDebug("bnd_bindingcnv: New stage: " + IntToString(nStage));
diff --git a/nwn/nwnprc/trunk/newspellbook/inv_eldtch_blast.nss b/nwn/nwnprc/trunk/newspellbook/inv_eldtch_blast.nss
index d4f4bc74..16b63d67 100644
--- a/nwn/nwnprc/trunk/newspellbook/inv_eldtch_blast.nss
+++ b/nwn/nwnprc/trunk/newspellbook/inv_eldtch_blast.nss
@@ -54,18 +54,18 @@ void main()
nDC += InvokerAbilityFocus(oPC, nEssence, nEssence2);
- int nDamageType = nEssence ? (nEssenceData >>> 4) & 0xFFF : DAMAGE_TYPE_MAGICAL;
- int nDamageType2 = nEssence2 ? (nEssenceData2 >>> 4) & 0xFFF : DAMAGE_TYPE_MAGICAL;
+ int nDamageType = nEssence ? (nEssenceData >>> 4) & 0xFFF : DAMAGE_TYPE_UNTYPED;
+ int nDamageType2 = nEssence2 ? (nEssenceData2 >>> 4) & 0xFFF : DAMAGE_TYPE_UNTYPED;
//Set correct blast damage type
if(nDamageType != nDamageType2)
{
- if(nDamageType != DAMAGE_TYPE_MAGICAL)
+ if(nDamageType != DAMAGE_TYPE_UNTYPED)
{
- if(nDamageType2 == DAMAGE_TYPE_MAGICAL)
+ if(nDamageType2 == DAMAGE_TYPE_UNTYPED)
nDamageType2 = nDamageType;
}
- else if(nDamageType2 != DAMAGE_TYPE_MAGICAL)
+ else if(nDamageType2 != DAMAGE_TYPE_UNTYPED)
{
nDamageType = nDamageType2;
}
@@ -116,17 +116,6 @@ void main()
LosePsionicFocus();
}
-
-/* if(GetIsPsionicallyFocused() && GetHasFeat(FEAT_GREATER_PSIONIC_SHOT))
- {
- nDam += d6(4);
- LosePsionicFocus();
- }
- if(GetIsPsionicallyFocused() && GetHasFeat(FEAT_PSIONIC_SHOT))
- {
- nDam += d6(2);
- LosePsionicFocus();
- } */
int nAtkBns = GetAttackBonus(oTarget, oPC, OBJECT_INVALID, FALSE, TOUCH_ATTACK_RANGED_SPELL);
if(GetHasFeat(FEAT_ELDRITCH_SCULPTOR))
diff --git a/nwn/nwnprc/trunk/newspellbook/inv_pathofshadow.nss b/nwn/nwnprc/trunk/newspellbook/inv_pathofshadow.nss
index 359783b3..4555b822 100644
--- a/nwn/nwnprc/trunk/newspellbook/inv_pathofshadow.nss
+++ b/nwn/nwnprc/trunk/newspellbook/inv_pathofshadow.nss
@@ -108,6 +108,12 @@ void main()
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(9999), oCaster);
}
+ // Teleport starts a forced dynamic conversation, which clears queued ActionCastSpell cleanup.
+ DeleteLocalInt(oCaster, PRC_CASTERCLASS_OVERRIDE);
+ DeleteLocalInt(oCaster, "UsingActionCastSpell");
+ DeleteLocalInt(oCaster, PRC_INVOKING_CLASS);
+ DeleteLocalInt(oCaster, PRC_INVOCATION_LEVEL);
+
Teleport(oCaster, nCasterLvl, nSpellID == INVOKE_PATH_OF_SHADOW_PARTY, FALSE, "");
diff --git a/nwn/nwnprc/trunk/newspellbook/tob_feats.nss b/nwn/nwnprc/trunk/newspellbook/tob_feats.nss
index 9d739ca0..1108db05 100644
--- a/nwn/nwnprc/trunk/newspellbook/tob_feats.nss
+++ b/nwn/nwnprc/trunk/newspellbook/tob_feats.nss
@@ -21,7 +21,23 @@
//////////////////////////////////////////////////
// Called on Heartbeat
-void ShadowBlade(object oInitiator)
+void ShadowBlade(object oInitiator)
+{
+ int nDex = GetAbilityModifier(ABILITY_DEXTERITY, oInitiator);
+ object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oInitiator);
+ int nWeap = GetIsDisciplineWeapon(oWeapon, DISCIPLINE_SHADOW_HAND);
+
+ // Must be a shadow hand weapon while a Shadow Hand stance is active
+ if (GetHasActiveStanceOfDiscipline(oInitiator, DISCIPLINE_SHADOW_HAND) && nWeap)
+ {
+ int nDamageType = GetWeaponDamageType(oWeapon);
+ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectDamageIncrease(IPGetDamageBonusConstantFromNumber(nDex), nDamageType)), oInitiator, 6.0);
+ SetLocalInt(oInitiator, "ShadowBladeDam", nDex);
+ DelayCommand(6.0, DeleteLocalInt(oInitiator, "ShadowBladeDam"));
+ }
+}
+
+/* void ShadowBlade(object oInitiator)
{
// Needs an active Shadow Hands stance
int nStance = GetHasActiveStance(oInitiator);
@@ -39,7 +55,7 @@ void ShadowBlade(object oInitiator)
SetLocalInt(oInitiator, "ShadowBladeDam", nDex);
DelayCommand(6.0, DeleteLocalInt(oInitiator, "ShadowBladeDam"));
}
-}
+} */
// Called on Heartbeat
void RapidAssault(object oInitiator)
@@ -118,7 +134,26 @@ void BladeMeditation(object oInitiator)
}
// Called on Heartbeat
-void IronheartAura(object oInitiator)
+void IronheartAura(object oInitiator)
+{
+ if (GetHasActiveStanceOfDiscipline(oInitiator, DISCIPLINE_IRON_HEART))
+ {
+ location lTarget = GetLocation(oInitiator);
+ object oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
+ while(GetIsObjectValid(oAreaTarget))
+ {
+ if(oAreaTarget != oInitiator &&
+ GetIsInMeleeRange(oInitiator, oAreaTarget) &&
+ GetIsFriend(oAreaTarget, oInitiator))
+ {
+ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectSavingThrowIncrease(SAVING_THROW_ALL, 2, SAVING_THROW_TYPE_ALL)), oAreaTarget, 6.0);
+ }
+ oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
+ }
+ }
+}
+
+/* void IronheartAura(object oInitiator)
{
int nDisc = GetDisciplineByManeuver(GetHasActiveStance(oInitiator));
if (nDisc == DISCIPLINE_IRON_HEART)
@@ -138,10 +173,20 @@ void IronheartAura(object oInitiator)
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}
-}
+} */
// Called on heartbeat
-void ShadowTrickster(object oInitiator)
+void ShadowTrickster(object oInitiator)
+{
+ if (GetHasActiveStanceOfDiscipline(oInitiator, DISCIPLINE_SHADOW_HAND))
+ {
+ SetLocalInt(oInitiator, "ShadowTrickster", TRUE);
+ }
+ else
+ DeleteLocalInt(oInitiator, "ShadowTrickster");
+}
+
+/* void ShadowTrickster(object oInitiator)
{
// Needs an active Shadow Hands stance
int nStance = GetHasActiveStance(oInitiator);
@@ -152,7 +197,7 @@ void ShadowTrickster(object oInitiator)
}
else
DeleteLocalInt(oInitiator, "ShadowTrickster");
-}
+} */
// Called on Heartbeat
void WhiteRavenDefense(object oInitiator)
diff --git a/nwn/nwnprc/trunk/others/prc_magiccraft.utm b/nwn/nwnprc/trunk/others/prc_magiccraft.utm
index 7aef67ae..e1c7ca4c 100644
Binary files a/nwn/nwnprc/trunk/others/prc_magiccraft.utm and b/nwn/nwnprc/trunk/others/prc_magiccraft.utm differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_admtbody.UTI b/nwn/nwnprc/trunk/others/prc_wf_admtbody.UTI
index 2b0e01b5..7e4487d5 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_admtbody.UTI and b/nwn/nwnprc/trunk/others/prc_wf_admtbody.UTI differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_compbody.UTI b/nwn/nwnprc/trunk/others/prc_wf_compbody.UTI
index 51399641..6f2c27a6 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_compbody.UTI and b/nwn/nwnprc/trunk/others/prc_wf_compbody.UTI differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_helmadmt.UTI b/nwn/nwnprc/trunk/others/prc_wf_helmadmt.UTI
index 74275edf..fb877ce7 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_helmadmt.UTI and b/nwn/nwnprc/trunk/others/prc_wf_helmadmt.UTI differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_helmhead.UTI b/nwn/nwnprc/trunk/others/prc_wf_helmhead.UTI
index 4f7793b8..f9325234 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_helmhead.UTI and b/nwn/nwnprc/trunk/others/prc_wf_helmhead.UTI differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_helmmith.UTI b/nwn/nwnprc/trunk/others/prc_wf_helmmith.UTI
index 2b488da6..59ab6d2b 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_helmmith.UTI and b/nwn/nwnprc/trunk/others/prc_wf_helmmith.UTI differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_helmwood.UTI b/nwn/nwnprc/trunk/others/prc_wf_helmwood.UTI
index 14470506..2f361b68 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_helmwood.UTI and b/nwn/nwnprc/trunk/others/prc_wf_helmwood.UTI differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_mithbody.UTI b/nwn/nwnprc/trunk/others/prc_wf_mithbody.UTI
index 0f9f93a0..3cb7b2e6 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_mithbody.UTI and b/nwn/nwnprc/trunk/others/prc_wf_mithbody.UTI differ
diff --git a/nwn/nwnprc/trunk/others/prc_wf_woodbody.UTI b/nwn/nwnprc/trunk/others/prc_wf_woodbody.UTI
index bf1f50e2..e630ea09 100644
Binary files a/nwn/nwnprc/trunk/others/prc_wf_woodbody.UTI and b/nwn/nwnprc/trunk/others/prc_wf_woodbody.UTI differ
diff --git a/nwn/nwnprc/trunk/psionics/psi_pow_concblst.nss b/nwn/nwnprc/trunk/psionics/psi_pow_concblst.nss
index b2472a6a..7302b52f 100644
--- a/nwn/nwnprc/trunk/psionics/psi_pow_concblst.nss
+++ b/nwn/nwnprc/trunk/psionics/psi_pow_concblst.nss
@@ -131,7 +131,7 @@ void DoPower(struct manifestation manif, object oMainTarget, int nDC, int nPen,
nDamage = MetaPsionicsDamage(manif, nDieSize, nNumberOfDice, 0, 0, TRUE, FALSE);
// Target-specific stuff
nDamage = GetTargetSpecificChangesToDamage(oAreaTarget, manif.oManifester, nDamage, TRUE, FALSE);
- eDamage = EffectDamage(nDamage, DAMAGE_TYPE_MAGICAL);
+ eDamage = EffectDamage(nDamage, DAMAGE_TYPE_FORCE);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oAreaTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oAreaTarget);
diff --git a/nwn/nwnprc/trunk/psionics/psi_pow_tkmove.nss b/nwn/nwnprc/trunk/psionics/psi_pow_tkmove.nss
index cb05fb6b..c20bd65b 100644
--- a/nwn/nwnprc/trunk/psionics/psi_pow_tkmove.nss
+++ b/nwn/nwnprc/trunk/psionics/psi_pow_tkmove.nss
@@ -22,20 +22,81 @@
You mentally push a foe, attempting to knock it prone and disarm it. The DC
of the discipline check for the target to resist being knocked down or
disarmed is equal to your manifester level + you ability modified in your
- manifesting stat. The Discipline checks to avoid being knocked down and
+ manifesting stat. The opposed combat checks to avoid being knocked down and
disarmed are rolled separately.
Augment: For every 2 additional power points spent, the DC of the Discipline
check is increased by 1.
*/
-#include "psi_inc_psifunc"
+#include "psi_inc_psifunc"
+#include "psi_inc_pwresist"
+#include "psi_spellhook"
+#include "prc_inc_spells"
+#include "prc_inc_combmove" // Add this include
+
+void main()
+{
+ if (!PsiPrePowerCastCode())
+ {
+ return;
+ }
+
+ object oManifester = OBJECT_SELF;
+ object oTarget = PRCGetSpellTargetObject();
+ struct manifestation manif =
+ EvaluateManifestation(oManifester, oTarget,
+ PowerAugmentationProfile(PRC_NO_GENERIC_AUGMENTS,
+ 2, PRC_UNLIMITED_AUGMENTATION
+ ),
+ METAPSIONIC_EXTEND | METAPSIONIC_TWIN
+ );
+
+ if(manif.bCanManifest)
+ {
+ int nPen = GetPsiPenetration(oManifester);
+ int nAbi = GetAbilityModifier(GetAbilityOfClass(GetManifestingClass(oManifester)), oManifester)
+ + manif.nTimesAugOptUsed_1;
+ effect eKnock = EffectKnockdown();
+ object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
+ float fDuration = 6.0f * (manif.nManifesterLevel / 2);
+ if(manif.bExtend) fDuration *= 2;
+
+ // Set BAB override for combat maneuvers
+ SetLocalInt(oManifester, "BABOverride", manif.nManifesterLevel);
+ DelayCommand(1.0, DeleteLocalInt(oManifester, "BABOverride"));
+
+ // Let the AI know
+ PRCSignalSpellEvent(oTarget, TRUE, manif.nSpellID, oManifester);
+
+ // Handle Twin Power
+ int nRepeats = manif.bTwin ? 2 : 1;
+ for(; nRepeats > 0; nRepeats--)
+ {
+ // Check for Power Resistance
+ if(PRCMyResistPower(oManifester, oTarget, nPen))
+ {
+ // Attempt disarm using combat maneuver system
+ if(GetIsCreatureDisarmable(oTarget) && !GetPRCSwitch(PRC_PNP_DISARM) && GetIsObjectValid(oWeapon))
+ {
+ DoDisarm(oManifester, oTarget, nAbi, FALSE, FALSE);
+ }
+
+ // Attempt trip using combat maneuver system
+ DoTrip(oManifester, oTarget, nAbi, FALSE, FALSE, FALSE, nAbi);
+
+ } // end if - SR check
+ } // end for - Twin Power
+ } // end if - Successfull manifestation
+}
+
+/* #include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_inc_spells"
void main()
-{
+{ */
/*
Spellcast Hook Code
Added 2004-11-02 by Stratovarius
@@ -44,7 +105,7 @@ void main()
*/
- if (!PsiPrePowerCastCode())
+/* if (!PsiPrePowerCastCode())
{
// If code within the PrePowerCastHook (i.e. UMD) reports FALSE, do not run this spell
return;
@@ -102,4 +163,4 @@ void main()
}// end if - SR check
}// end for - Twin Power
}// end if - Successfull manifestation
-}
+} */
diff --git a/nwn/nwnprc/trunk/scripts/ft_sanctmartial.nss b/nwn/nwnprc/trunk/scripts/ft_sanctmartial.nss
index 5810e7db..f693d640 100644
--- a/nwn/nwnprc/trunk/scripts/ft_sanctmartial.nss
+++ b/nwn/nwnprc/trunk/scripts/ft_sanctmartial.nss
@@ -61,13 +61,13 @@ void Sanctify()
if(!Sanctify_Feat_Wrapper(iType, oPC, oItem)) return;
- itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1);
+ itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_HOLY, IP_CONST_DAMAGEBONUS_1);
ip1 = TagItemProperty(ip1,"Sanctify1");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
- itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
+ itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_HOLY, IP_CONST_DAMAGEBONUS_1d4);
ip2 = TagItemProperty(ip2,"Sanctify2");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
- itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
+ itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_HOLY, IP_CONST_DAMAGEBONUS_1d4);
ip3 = TagItemProperty(ip3,"Sanctify3");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
@@ -108,9 +108,9 @@ void Sanctify()
if(GetLocalInt(oItem,"SanctMar"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"SanctMar");
}
@@ -144,17 +144,17 @@ void Sanctify()
if ( GetLocalInt(oItem,"SanctMar"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"", IP_CONST_DAMAGETYPE_HOLY, DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"", IP_CONST_DAMAGETYPE_HOLY, DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"", IP_CONST_DAMAGETYPE_HOLY, DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"SanctMar");
}
if ( GetLocalInt(oItem2,"SanctMar"))
{
- RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_HOLY, DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY, DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem2,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY, DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem2,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem2,"SanctMar");
}
@@ -183,13 +183,13 @@ void Sanctify()
if(Sanctify_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"SanctMar")))
{
- itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1);
+ itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_HOLY,IP_CONST_DAMAGEBONUS_1);
ip1 = TagItemProperty(ip1,"Sanctify1");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
- itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
+ itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_HOLY,IP_CONST_DAMAGEBONUS_1d4);
ip2 = TagItemProperty(ip2,"Sanctify2");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
- itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
+ itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_HOLY,IP_CONST_DAMAGEBONUS_1d4);
ip3 = TagItemProperty(ip3,"Sanctify3");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
@@ -202,13 +202,13 @@ void Sanctify()
iType= GetBaseItemType(oItem);
if(Sanctify_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"SanctMar")))
{
- itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1);
+ itemproperty ip1 = ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGETYPE_HOLY,IP_CONST_DAMAGEBONUS_1);
ip1 = TagItemProperty(ip1,"Sanctify1");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
- itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
+ itemproperty ip2 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGETYPE_HOLY,IP_CONST_DAMAGEBONUS_1d4);
ip2 = TagItemProperty(ip2,"Sanctify2");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
- itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1d4);
+ itemproperty ip3 = ItemPropertyDamageBonusVsRace(IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGETYPE_HOLY,IP_CONST_DAMAGEBONUS_1d4);
ip3 = TagItemProperty(ip3,"Sanctify3");
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
@@ -269,7 +269,7 @@ void Vile()
if(nAlign > 7)
AdjustAlignment(oPC, ALIGNMENT_EVIL, 7, FALSE);
- AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
+ AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_VILE,IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
SetLocalInt(oItem,"USanctMar",1);
}
@@ -305,7 +305,7 @@ void Vile()
if ( GetLocalInt(oItem,"USanctMar"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS,IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1,1,"",-1,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS,IP_CONST_DAMAGETYPE_VILE, IP_CONST_DAMAGEBONUS_1,1,"",-1,DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"USanctMar");
}
@@ -339,7 +339,7 @@ void Vile()
if (Vile_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"USanctMar")))
{
- AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
+ AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_VILE, IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
SetLocalInt(oItem,"USanctMar",1);
int nAlign = GetGoodEvilValue(OBJECT_SELF);
@@ -352,7 +352,7 @@ void Vile()
iType= GetBaseItemType(oItem);
if(Vile_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"USanctMar")))
{
- AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_DIVINE,IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
+ AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_VILE, IP_CONST_DAMAGEBONUS_1),oItem,9999.0);
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
SetLocalInt(oItem,"USanctMar",1);
int nAlign = GetGoodEvilValue(OBJECT_SELF);
@@ -431,16 +431,16 @@ void main()
if ( GetLocalInt(oItem,"SanctMar"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP, IP_CONST_ALIGNMENTGROUP_EVIL, IP_CONST_DAMAGEBONUS_1, 1,"", IP_CONST_DAMAGETYPE_HOLY, DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"SanctMar");
}
if (GetLocalInt(oItem,"MartialStrik"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"MartialStrik");
}
@@ -449,16 +449,16 @@ void main()
if ( GetLocalInt(oItem,"SanctMar"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_1, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_UNDEAD,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP,IP_CONST_RACIALTYPE_OUTSIDER,IP_CONST_DAMAGEBONUS_1d4, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"SanctMar");
}
if ( GetLocalInt(oItem,"MartialStrik"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_EVIL,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_HOLY,DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"MartialStrik");
}
@@ -504,7 +504,7 @@ void main()
*/
if (GetLocalInt(oItem,"UnholyStrik"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_GOOD,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_GOOD,IP_CONST_DAMAGEBONUS_2d6, 1,"", IP_CONST_DAMAGETYPE_UNHOLY, DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"UnholyStrik");
}
@@ -521,7 +521,7 @@ void main()
*/
if ( GetLocalInt(oItem,"UnholyStrik"))
{
- RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP,IP_CONST_ALIGNMENTGROUP_GOOD,IP_CONST_DAMAGEBONUS_2d6, 1,"",IP_CONST_DAMAGETYPE_DIVINE,DURATION_TYPE_TEMPORARY);
+ RemoveSpecificProperty(oItem,ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP, IP_CONST_ALIGNMENTGROUP_GOOD, IP_CONST_DAMAGEBONUS_2d6, 1,"", IP_CONST_DAMAGETYPE_UNHOLY, DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
DeleteLocalInt(oItem,"UnholyStrik");
}
@@ -544,8 +544,8 @@ void main()
// Sanctify Strike
if (GetHasFeat(FEAT_SANCTIFYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE)))
{
- effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1,DAMAGE_TYPE_POSITIVE),ALIGNMENT_ALL,ALIGNMENT_EVIL);
- effect eEffect2 = VersusRacialTypeEffect(EffectDamageIncrease(DAMAGE_BONUS_1d4,DAMAGE_TYPE_POSITIVE),RACIAL_TYPE_OUTSIDER);
+ effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1,DAMAGE_TYPE_HOLY),ALIGNMENT_ALL,ALIGNMENT_EVIL);
+ effect eEffect2 = VersusRacialTypeEffect(EffectDamageIncrease(DAMAGE_BONUS_1d4,DAMAGE_TYPE_HOLY),RACIAL_TYPE_OUTSIDER);
effect eLink = EffectLinkEffects(eEffect1,eEffect2);
eLink = TagEffect(eLink,"SanctifyKiStrike");
@@ -564,7 +564,7 @@ void main()
// Holy Ki Strike
if (GetHasFeat(FEAT_HOLYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_HOLYKISTRIKE)))
{
- effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2d6,DAMAGE_TYPE_POSITIVE),ALIGNMENT_ALL,ALIGNMENT_EVIL);
+ effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2d6, DAMAGE_TYPE_HOLY), ALIGNMENT_ALL, ALIGNMENT_EVIL);
eEffect1 = TagEffect(eEffect1,"HolyKiStrike");
//Remove any prior bonus to avoid duplication and remove Sanctify Ki Strike
diff --git a/nwn/nwnprc/trunk/scripts/prc_forsaker.nss b/nwn/nwnprc/trunk/scripts/prc_forsaker.nss
index b98d8aa0..725f9ec1 100644
--- a/nwn/nwnprc/trunk/scripts/prc_forsaker.nss
+++ b/nwn/nwnprc/trunk/scripts/prc_forsaker.nss
@@ -200,10 +200,33 @@ void main()
else if(nEvent == EVENT_ONPLAYEREQUIPITEM)
{
oPC = GetItemLastEquippedBy();
- oItem = GetItemLastEquipped();
- if(DEBUG) DoDebug("prc_forsaker - OnEquip\n"
+ oItem = GetItemLastEquipped();
+
+ string sTag = GetTag(oItem);
+ string sResRef = GetResRef(oItem);
+
+ int nRace = GetRacialType(oPC);
+
+ if(DEBUG) DoDebug("prc_forsaker - OnEquip\n"
+ "oPC = " + DebugObject2Str(oPC) + "\n"
- + "oItem = " + DebugObject2Str(oItem) + "\n");
+ + "oItem = " + DebugObject2Str(oItem) + "\n");
+
+ if(nRace == RACIAL_TYPE_WARFORGED
+ || nRace == RACIAL_TYPE_WARFORGED_SCOUT
+ || nRace == RACIAL_TYPE_WARFORGED_CHARGER)
+ {
+ if(sResRef == "prc_wf_admtbody"
+ || sResRef == "prc_wf_compbody"
+ || sResRef == "prc_wf_woodbody"
+ || sResRef == "prc_wf_mithbody"
+ || sResRef == "prc_wf_helmhead"
+ || sResRef == "prc_wf_helmadmt"
+ || sResRef == "prc_wf_helmwood"
+ || sResRef == "prc_wf_helmmith")
+
+ return;
+
+ }
if(!GetHasFeat(FEAT_VOWOFPOVERTY,oPC))
{
diff --git a/nwn/nwnprc/trunk/scripts/prc_reservinvndl.nss b/nwn/nwnprc/trunk/scripts/prc_reservinvndl.nss
index d45b8262..7cc23aea 100644
--- a/nwn/nwnprc/trunk/scripts/prc_reservinvndl.nss
+++ b/nwn/nwnprc/trunk/scripts/prc_reservinvndl.nss
@@ -98,5 +98,7 @@ void main()
return;
}
+ SignalEvent(oPC, EventSpellCastAt(oTarget, PRCGetSpellId(), FALSE));
+
ForceNeedleAttack(oPC, oTarget, nBonus);
}
diff --git a/nwn/nwnprc/trunk/scripts/prc_rest.nss b/nwn/nwnprc/trunk/scripts/prc_rest.nss
index 03c52e2f..1a35bfbc 100644
--- a/nwn/nwnprc/trunk/scripts/prc_rest.nss
+++ b/nwn/nwnprc/trunk/scripts/prc_rest.nss
@@ -21,7 +21,18 @@
#include "shd_inc_myst"
#include "prc_inc_template"
-
+void ClearAstarothCraftingFeat(object oPC)
+{
+ effect eOld = GetFirstEffect(oPC);
+ while (GetIsEffectValid(eOld))
+ {
+ if (GetEffectTag(eOld) == "AstarothCraftingFeat")
+ {
+ RemoveEffect(oPC, eOld);
+ }
+ eOld = GetNextEffect(oPC);
+ }
+}
void ResetLionSwiftness(object oPC)
{
@@ -347,6 +358,7 @@ void RestFinished(object oPC)
}
ResetLionSwiftness(oPC);
+ ClearAstarothCraftingFeat(oPC);
// Execute scripts hooked to this event for the player triggering it
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERREST_FINISHED);
diff --git a/nwn/nwnprc/trunk/scripts/prc_shou.nss b/nwn/nwnprc/trunk/scripts/prc_shou.nss
index 55e703a8..f3c7e82d 100644
--- a/nwn/nwnprc/trunk/scripts/prc_shou.nss
+++ b/nwn/nwnprc/trunk/scripts/prc_shou.nss
@@ -11,6 +11,7 @@
#include "prc_alterations"
#include "prc_inc_unarmed"
+#include "prc_inc_combat"
/*
@@ -98,12 +99,42 @@ void main()
FloatingTextStringOnCreature("*Shou Disciple Abilities Disabled Due To Equipped Shield*", oPC);
}
- // This checks to make sure he doesnt have a non-light weapon equipped for Martial Flurry Light
+
+ // This checks to make sure he doesnt have a non-light weapon equipped for Martial Flurry Light
+ else if(StringToInt(Get2DACache("baseitems", "WeaponSize", iBaseL)) > 2 || StringToInt(Get2DACache("baseitems", "WeaponSize", iBaseR)) > 2)
+ {
+ PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_LIGHT);
+ FloatingTextStringOnCreature("*Martial Flurry Light Disabled Due to Equipped Weapons*", oPC);
+ }
+ // Check for Monk weapon interaction
+ else if(GetLevelByClass(CLASS_TYPE_MONK, oPC) && GetIsMonkWeaponTypeOrUnarmed(iBaseR))
+ {
+ PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_LIGHT);
+ PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_ALL);
+ FloatingTextStringOnCreature("*Martial Flurry Disabled Due to Monk Weapon Conflict*", oPC);
+ }
+ else
+ {
+ if(GetLevelByClass(CLASS_TYPE_SHOU, oPC) > 1 )
+ {
+ RemoveDodge(oPC, oSkin);
+ DodgeBonus(oPC, oSkin);
+ }
+ }
+
+/* // This checks to make sure he doesnt have a non-light weapon equipped for Martial Flurry Light
else if(StringToInt(Get2DACache("baseitems", "WeaponSize", iBaseL)) > 2 || StringToInt(Get2DACache("baseitems", "WeaponSize", iBaseR)) > 2)
{
PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_LIGHT);
FloatingTextStringOnCreature("*Martial Flurry Light Disabled Due to Equipped Weapons*", oPC);
}
+ // Check for Monk weapon interaction
+ if(GetLevelByClass(CLASS_TYPE_MONK, oPC) && GetIsMonkWeaponTypeOrUnarmed(iBaseR))
+ {
+ PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_LIGHT);
+ PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_ALL);
+ FloatingTextStringOnCreature("*Martial Flurry Disabled Due to Monk Weapon Conflict*", oPC);
+ }
else
{
if(GetLevelByClass(CLASS_TYPE_SHOU, oPC) > 1 )
@@ -111,7 +142,7 @@ void main()
RemoveDodge(oPC, oSkin);
DodgeBonus(oPC, oSkin);
}
- }
+ } */
//Evaluate The Unarmed Strike Feats
//UnarmedFeats(oPC);
diff --git a/nwn/nwnprc/trunk/scripts/tmp_m_saint.nss b/nwn/nwnprc/trunk/scripts/tmp_m_saint.nss
index 78bc5e4d..6c0a1e4c 100644
--- a/nwn/nwnprc/trunk/scripts/tmp_m_saint.nss
+++ b/nwn/nwnprc/trunk/scripts/tmp_m_saint.nss
@@ -225,10 +225,10 @@ void main()
//:: Setup Holy Touch extra damage vs evil
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
- effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1d6, DAMAGE_TYPE_DIVINE), 0, ALIGNMENT_EVIL);
- effect eEffect2 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_DIVINE), 0, ALIGNMENT_EVIL);
+ effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1d6, DAMAGE_TYPE_HOLY), 0, ALIGNMENT_EVIL);
+ effect eEffect2 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_HOLY), 0, ALIGNMENT_EVIL);
eEffect2 = VersusRacialTypeEffect(eEffect2, RACIAL_TYPE_OUTSIDER);
- effect eEffect3 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_DIVINE), 0, ALIGNMENT_EVIL);
+ effect eEffect3 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_HOLY), 0, ALIGNMENT_EVIL);
eEffect3 = VersusRacialTypeEffect(eEffect3, RACIAL_TYPE_UNDEAD);
effect eLink = EffectLinkEffects(eEffect1, eEffect2);
eLink = EffectLinkEffects(eLink, eEffect3);
@@ -316,12 +316,12 @@ void main()
if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_OUTSIDER ||
MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
- eDam = EffectDamage(d8(1), DAMAGE_TYPE_DIVINE);
+ eDam = EffectDamage(d8(1), DAMAGE_TYPE_HOLY);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
}
else
{
- eDam = EffectDamage(d6(1), DAMAGE_TYPE_DIVINE);
+ eDam = EffectDamage(d6(1), DAMAGE_TYPE_HOLY);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
}
}
diff --git a/nwn/nwnprc/trunk/spells/nw_s0_horrwilt.nss b/nwn/nwnprc/trunk/spells/nw_s0_horrwilt.nss
index 42844412..79938116 100644
--- a/nwn/nwnprc/trunk/spells/nw_s0_horrwilt.nss
+++ b/nwn/nwnprc/trunk/spells/nw_s0_horrwilt.nss
@@ -103,7 +103,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
}
//nDamage += ApplySpellBetrayalStrikeDamage(oTarget, OBJECT_SELF, FALSE);
//Set the damage effect
- eDam = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_MAGICAL);
+ eDam = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_DESSICATION);
// Apply effects to the currently selected target.
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
PRCBonusDamage(oTarget);
diff --git a/nwn/nwnprc/trunk/spells/nw_s0_magmiss.nss b/nwn/nwnprc/trunk/spells/nw_s0_magmiss.nss
index bef9eb0c..daeb8e64 100644
--- a/nwn/nwnprc/trunk/spells/nw_s0_magmiss.nss
+++ b/nwn/nwnprc/trunk/spells/nw_s0_magmiss.nss
@@ -80,7 +80,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
//Apply the MIRV and damage effect
nDam += SpellDamagePerDice(OBJECT_SELF, 1);
- effect eDam = PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_MAGICAL);
+ effect eDam = PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_FORCE);
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget,0.0f,FALSE));
DelayCommand(fDelay2, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget));
diff --git a/nwn/nwnprc/trunk/spells/sp_blastfrc.nss b/nwn/nwnprc/trunk/spells/sp_blastfrc.nss
index 8f147be9..03d70ed3 100644
--- a/nwn/nwnprc/trunk/spells/sp_blastfrc.nss
+++ b/nwn/nwnprc/trunk/spells/sp_blastfrc.nss
@@ -66,7 +66,7 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget, 3.0);
}
- effect eDam = PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_MAGICAL);
+ effect eDam = PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_FORCE);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DESTRUCTION), oTarget);
}
diff --git a/nwn/nwnprc/trunk/spells/sp_brk_enchant.nss b/nwn/nwnprc/trunk/spells/sp_brk_enchant.nss
index 1e863b05..3498da9e 100644
--- a/nwn/nwnprc/trunk/spells/sp_brk_enchant.nss
+++ b/nwn/nwnprc/trunk/spells/sp_brk_enchant.nss
@@ -50,7 +50,19 @@ void main()
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, PRCGetSpellTargetLocation());
- oTarget = MyFirstObjectInShape(SHAPE_SPHERE, 9.14f, lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_PLACEABLE );
+
+ int nTargetsAffected = 0;
+ oTarget = MyFirstObjectInShape(SHAPE_SPHERE, 9.14f, lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_PLACEABLE);
+
+ while (GetIsObjectValid(oTarget) && nTargetsAffected < nCasterLevel)
+ {
+ SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_REMOVE_CURSE));
+ DispelLoop(oTarget, nCasterLevel);
+ nTargetsAffected++;
+ oTarget = MyNextObjectInShape(SHAPE_SPHERE, 9.14f, lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_PLACEABLE);
+ }
+
+/* oTarget = MyFirstObjectInShape(SHAPE_SPHERE, 9.14f, lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_PLACEABLE );
//Set up for loop
int i = nCasterLevel;
@@ -61,7 +73,7 @@ void main()
DispelLoop(oTarget, nCasterLevel);
i--;
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE,lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT | OBJECT_TYPE_PLACEABLE);
- }
+ } */
PRCSetSchool();
}
diff --git a/nwn/nwnprc/trunk/spells/sp_command.nss b/nwn/nwnprc/trunk/spells/sp_command.nss
index 5b504c8b..fc0bd0f9 100644
--- a/nwn/nwnprc/trunk/spells/sp_command.nss
+++ b/nwn/nwnprc/trunk/spells/sp_command.nss
@@ -23,6 +23,9 @@ Halt - The target stands in place and takes no action for one round.
Author: Stratovarius
Created: 29/4/06
+
+Fixed by: Jaysyn
+Date: 2026-05-29 00:57:05
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
@@ -61,12 +64,15 @@ void main()
if (!PRCDoResistSpell(OBJECT_SELF, oTarget, nCaster+SPGetPenetr()) && PRCGetIsAliveCreature(oTarget))
{
- if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS))
- {
- SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration), TRUE,-1,nCaster);
- SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
- DoCommandSpell(oCaster, oTarget, nSpellId, nDuration, nCaster);
- }
+ if(!GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS))
+ {
+ if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS))
+ {
+ SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration), TRUE,-1,nCaster);
+ SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
+ DoCommandSpell(oCaster, oTarget, nSpellId, nDuration, nCaster);
+ }
+ }
}
PRCSetSchool();
diff --git a/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss b/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss
index d9011292..4c40f166 100644
--- a/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss
+++ b/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss
@@ -133,13 +133,13 @@ void DarkLoop(object oTarget, object oPC, int nMetaMagic)
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);
+ SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_UNHOLY), oTarget);
}
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);
+ SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_UNHOLY), oTarget);
}
else
diff --git a/nwn/nwnprc/trunk/spells/sp_forceblast.nss b/nwn/nwnprc/trunk/spells/sp_forceblast.nss
index 7b49f750..f816fbb9 100644
--- a/nwn/nwnprc/trunk/spells/sp_forceblast.nss
+++ b/nwn/nwnprc/trunk/spells/sp_forceblast.nss
@@ -11,7 +11,7 @@ void main()
int nDice = nCasterLevel > 10 ? 10 : nCasterLevel;
DoBolt (nCasterLevel,4, 0, nDice, VFX_BEAM_MIND, VFX_IMP_MAGBLUE,
- DAMAGE_TYPE_MAGICAL, SAVING_THROW_TYPE_SPELL,
+ DAMAGE_TYPE_FORCE, SAVING_THROW_TYPE_SPELL,
SPELL_SCHOOL_EVOCATION, TRUE, GetSpellId());
}
diff --git a/nwn/nwnprc/trunk/spells/sp_forcemissiles.nss b/nwn/nwnprc/trunk/spells/sp_forcemissiles.nss
index 2fadcd9e..2182fa22 100644
--- a/nwn/nwnprc/trunk/spells/sp_forcemissiles.nss
+++ b/nwn/nwnprc/trunk/spells/sp_forcemissiles.nss
@@ -62,7 +62,7 @@ void SendMissileBomb(object oCaster, object oTarget, float fDelay=0.0, float fTi
if (nMetaMagic == METAMAGIC_EMPOWER)
nDam += nDam/2;
- DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oLoop, nDam, DAMAGE_TYPE_MAGICAL), oLoop));
+ DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oLoop, nDam, DAMAGE_TYPE_FORCE), oLoop));
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_MAGBLUE, FALSE, 4.0f), oLoop));
}
else if (!PRCDoResistSpell(oCaster, oLoop, nPenetr, fDelay))
diff --git a/nwn/nwnprc/trunk/spells/sp_forceorb.nss b/nwn/nwnprc/trunk/spells/sp_forceorb.nss
index b888b4fc..0f495df7 100644
--- a/nwn/nwnprc/trunk/spells/sp_forceorb.nss
+++ b/nwn/nwnprc/trunk/spells/sp_forceorb.nss
@@ -29,7 +29,7 @@ void main()
PRCSignalSpellEvent(oTarget, TRUE, nSpellId);
//Roll damage for each target
- int nDamage = PRCGetMetaMagicDamage(DAMAGE_TYPE_MAGICAL, nDice, 6);
+ int nDamage = PRCGetMetaMagicDamage(DAMAGE_TYPE_FORCE, nDice, 6);
nDamage += SpellDamagePerDice(oCaster, nDice);
// Succeeded on the save
if (PRCMySavingThrow(SAVING_THROW_FORT, oTarget, PRCGetSaveDC(oTarget, oCaster)))
diff --git a/nwn/nwnprc/trunk/spells/sp_mjmagmiss.nss b/nwn/nwnprc/trunk/spells/sp_mjmagmiss.nss
index 95ecca19..1edf9feb 100644
--- a/nwn/nwnprc/trunk/spells/sp_mjmagmiss.nss
+++ b/nwn/nwnprc/trunk/spells/sp_mjmagmiss.nss
@@ -94,7 +94,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
fTime += fDelay2;
//Set damage effect
- effect eDam = PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_MAGICAL);
+ effect eDam = PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_FORCE);
//Apply the MIRV and damage effect
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
diff --git a/nwn/nwnprc/trunk/spells/sp_nec_bloat.nss b/nwn/nwnprc/trunk/spells/sp_nec_bloat.nss
index 72f6ce8a..986798a8 100644
--- a/nwn/nwnprc/trunk/spells/sp_nec_bloat.nss
+++ b/nwn/nwnprc/trunk/spells/sp_nec_bloat.nss
@@ -85,8 +85,7 @@ void main()
int nVile = nDam/2;
int nNorm = (nDam - nVile);
- //Vile damage is currently being applied as Positive damage
- effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_POSITIVE);
+ effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_VILE);
effect eNormDam = PRCEffectDamage(oTarget, nNorm, DAMAGE_TYPE_MAGICAL);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
diff --git a/nwn/nwnprc/trunk/spells/sp_nec_erupt.nss b/nwn/nwnprc/trunk/spells/sp_nec_erupt.nss
index 0c916163..79b8915f 100644
--- a/nwn/nwnprc/trunk/spells/sp_nec_erupt.nss
+++ b/nwn/nwnprc/trunk/spells/sp_nec_erupt.nss
@@ -96,8 +96,8 @@ void main()
nDam += SpellDamagePerDice(oPC, nLevel);
int nVile = nDam/2;
int nNorm = (nDam - nVile);
- //Vile damage is currently being applied as Positive damage
- effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_POSITIVE);
+
+ effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_VILE);
effect eNormDam = PRCEffectDamage(oTarget, nNorm, DAMAGE_TYPE_MAGICAL);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
diff --git a/nwn/nwnprc/trunk/spells/sp_nec_term.nss b/nwn/nwnprc/trunk/spells/sp_nec_term.nss
index 20fc11d5..3113b1b8 100644
--- a/nwn/nwnprc/trunk/spells/sp_nec_term.nss
+++ b/nwn/nwnprc/trunk/spells/sp_nec_term.nss
@@ -42,6 +42,7 @@
#include "prc_inc_switch"
#include "inc_utility"
#include "prc_add_spell_dc"
+#include "prc_misc_const"
void main()
@@ -110,8 +111,8 @@ void main()
nDam += SpellDamagePerDice(oPC, nLevel);
int nVile = nDam/2;
int nNorm = (nDam - nVile);
- //Vile damage is currently being applied as Positive damage
- effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_POSITIVE);
+
+ effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_VILE);
effect eNormDam = PRCEffectDamage(oTarget, nNorm, DAMAGE_TYPE_MAGICAL);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
diff --git a/nwn/nwnprc/trunk/spells/sp_orb_force.nss b/nwn/nwnprc/trunk/spells/sp_orb_force.nss
index 67ff8e8b..e7eb4855 100644
--- a/nwn/nwnprc/trunk/spells/sp_orb_force.nss
+++ b/nwn/nwnprc/trunk/spells/sp_orb_force.nss
@@ -51,7 +51,7 @@ void main()
if(nTouch)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_BOMB), oTarget);
- ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_MAGICAL), oTarget);
+ ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_FORCE), oTarget);
}
}
\ No newline at end of file
diff --git a/nwn/nwnprc/trunk/spells/x2_s0_persblde.nss b/nwn/nwnprc/trunk/spells/x2_s0_persblde.nss
index 21d0d30b..7d308322 100644
--- a/nwn/nwnprc/trunk/spells/x2_s0_persblde.nss
+++ b/nwn/nwnprc/trunk/spells/x2_s0_persblde.nss
@@ -1,6 +1,6 @@
//::///////////////////////////////////////////////
//:: Shelgarn's Persistent Blade
-//:: X2_S0_PersBlde
+//:: x2_s0_persblde
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
@@ -13,6 +13,7 @@
//:: Last Updated By: Georg Zoeller, Aug 2003
//:: altered by mr_bumpkin Dec 4, 2003 for prc stuff
#include "prc_inc_spells"
+#include "inc_spirit_weapn"
//Creates the weapon that the creature will be using.
void spellsCreateItemForSummoned(object oCaster, float fDuration, int nClass)
@@ -29,7 +30,8 @@ void spellsCreateItemForSummoned(object oCaster, float fDuration, int nClass)
nStat = 1;
object oWeapon;
- string sWeapon = "NW_WSWDG001";
+ //string sWeapon = "NW_WSWDG001";
+ string sWeapon = "PRC_PERBLADE01";
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster);
int i = 1;
while(GetIsObjectValid(oSummon))
@@ -54,7 +56,118 @@ void spellsCreateItemForSummoned(object oCaster, float fDuration, int nClass)
void main()
{
- if(!X2PreSpellCastCode()) return;
+//:: Check the Spellhook
+ if (!X2PreSpellCastCode()) return;
+
+//:: Set the Spell School
+ PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
+
+ int nRunEvent = GetRunningEvent();
+
+ if (nRunEvent == EVENT_NPC_ONSPELLCASTAT)
+ {
+ // Get the caster of the spell
+ object oCaster = GetLastSpellCaster();
+ int nCasterLevel = PRCGetCasterLevel(oCaster);
+
+ if(DEBUG) DoDebug("x2_s0_persblde: EVENT_NPC_ONSPELLCASTAT triggered.");
+
+ // Get the spell ID
+ int nSpellId = GetLastSpell();
+ if(DEBUG) DoDebug("x2_s0_persblde: Dispel spell ID: " + IntToString(nSpellId));
+
+ // Check if the spell ID is a dispel spell
+ if (nSpellId == SPELL_DISPEL_MAGIC || nSpellId == SPELL_LESSER_DISPEL || nSpellId == SPELL_GREATER_DISPELLING || nSpellId == SPELL_MORDENKAINENS_DISJUNCTION
+ || nSpellId == SPELL_SLASHING_DISPEL || nSpellId == SPELL_DISPELLING_TOUCH || nSpellId == SPELL_PIXIE_DISPEL || nSpellId == SPELL_GREAT_WALL_OF_DISPEL)
+ {
+ // Get the target of the spell
+ object oTarget = OBJECT_SELF;
+ if(DEBUG) DoDebug("x2_s0_persblde: Spell targeted at: " + GetName(oTarget));
+
+ // Check if the target is OBJECT_SELF
+ if (oTarget == OBJECT_SELF)
+ {
+ // Retrieve the original caster of the Persistent Blade spell from oSummon
+ object oSummon = OBJECT_SELF;
+ object oOriginalCaster = GetLocalObject(oSummon, "MY_CASTER");
+
+ // Ensure oOriginalCaster is valid
+ if (GetIsObjectValid(oOriginalCaster))
+ {
+ if(DEBUG) DoDebug("x2_s0_persblde: Original caster found. Caster level: " + IntToString(GetCasterLevel(oOriginalCaster)));
+
+ // Determine the DC for the dispel check
+ int nDispelDC = 11 + GetCasterLevel(oOriginalCaster);
+ if(DEBUG) DoDebug("x2_s0_persblde: Dispel DC: " + IntToString(nDispelDC));
+
+ // Determine the maximum cap for the dispel check
+ int nDispelCap = 0;
+ if (nSpellId == SPELL_LESSER_DISPEL)
+ nDispelCap = 5;
+ else if (nSpellId == SPELL_DISPEL_MAGIC || nSpellId == SPELL_SLASHING_DISPEL || nSpellId == SPELL_DISPELLING_TOUCH || nSpellId == SPELL_PIXIE_DISPEL || nSpellId == INVOKE_VORACIOUS_DISPELLING)
+ nDispelCap = 10;
+ else if (nSpellId == SPELL_GREATER_DISPELLING || nSpellId == SPELL_GREAT_WALL_OF_DISPEL)
+ nDispelCap = 15;
+ else if (nSpellId == SPELL_MORDENKAINENS_DISJUNCTION)
+ nDispelCap = 0; // No cap for Disjunction
+
+ // Roll for the dispel check
+ int nDispelRoll = d20();
+ int nCappedCasterLevel = nCasterLevel;
+
+ if (nDispelCap > 0 && nCasterLevel > nDispelCap)
+ nCappedCasterLevel = nDispelCap;
+
+ nDispelRoll += nCappedCasterLevel;
+
+ if(DEBUG) DoDebug("x2_s0_persblde: Dispel roll: " + IntToString(nDispelRoll) + " (Caster Level: " + IntToString(nCappedCasterLevel) + ", Cap: " + IntToString(nDispelCap) + ")");
+
+ // Compare the dispel result to the DC
+ if (nDispelRoll >= nDispelDC)
+ {
+ if(DEBUG) DoDebug("x2_s0_persblde: Dispel check succeeded.");
+
+ // Dispel succeeded, destroy oSummon and the item in its right hand
+ object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oSummon);
+
+ if(DEBUG) DoDebug("x2_s0_persblde: Dispel Magic succeeded. Destroying Persistent Blade and its right hand item.");
+
+ // Set flags and destroy objects with delays
+ SetPlotFlag(oWeapon, FALSE);
+ SetPlotFlag(oSummon, FALSE);
+ SetImmortal(oSummon, FALSE);
+
+ ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_DISPEL), oSummon);
+
+ // Destroy the weapon and summon with delays
+ if (GetIsObjectValid(oWeapon))
+ {
+ DelayCommand(0.5f, DestroyObject(oWeapon));
+ if(DEBUG) DoDebug("x2_s0_persblde: Persistent Blade destruction scheduled.");
+ }
+ else
+ {
+ if(DEBUG) DoDebug("x2_s0_persblde: No weapon found in right hand.");
+ }
+
+ DelayCommand(1.0f, DestroyObject(oSummon));
+ if(DEBUG) DoDebug("x2_s0_persblde: Persistent Blade Summon destruction scheduled.");
+ }
+ else
+ {
+ RegisterSummonEvents(oSummon);
+ if(DEBUG) DoDebug("x2_s0_persblde: Dispel check failed.");
+ }
+ }
+ else
+ {
+ if(DEBUG) DoDebug("x2_s0_persblde: Original caster not found.");
+ }
+ }
+ }
+ return;
+ }
+
PRCSetSchool(SPELL_SCHOOL_CONJURATION);
diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk
index 4681f983..97256908 100644
Binary files a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk differ
diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
index b5678af6..59eb7081 100644
--- a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
+++ b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml
@@ -5393,6 +5393,24 @@ Base Critical Threat: x2
Base Damage Type: Piercing
Weapon Size: Small
Feats Required: Simple
+ Sanctified
+ Sanctified Damage
+ <CUSTOM0> Sanctified
+ Holy
+ Holy Damage
+ <CUSTOM0> Holy
+ Unholy
+ Unholy Damage
+ <CUSTOM0> Unholy
+ Falling
+ Falling Damage
+ <CUSTOM0> Falling
+ Ballistic
+ Ballistic Damage
+ <CUSTOM0> Ballistic
+ Dessication
+ Dessication Damage
+ <CUSTOM0> Dessication
Untyped
Untyped Damage
<CUSTOM0> Untyped
diff --git a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk
index 4681f983..97256908 100644
Binary files a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk differ