2026/06/05 Update

Added Sanctified damage type.
Added Holy damage type.
Added Unholy damage type.
Added Falling damage type.
Added Ballistic damage type.
Added Desiccation damage type.
Fixed Major Missile's LABEL in spells.2da.
Fixed Major Missile's LABEL in des_cft_spells.2da.
Fixed Major Missile's LABEL in des_cft_scrolls.2da.
Disabled incomplete PnP version of Shades spell.
Astaroth's free crafting feats should drop off onRest, when expelling a vestige & when rebinding a vestige.
Re-enabled caster level override variable clearing in GetInvokerLevel().
Change Piercing Cold's damagetype to Untyped.
Constanted new damagetypes correctly for scripting (@lightbeard)
Changed all force spells damagetype to force.
Fixed issue with Initiators using Shadows Blade, Ironheart Aura and Shadow Trickster with dual-stances.
Changed Eldritch Blast to Untyped damage.
Fixed Path of Shadow screwing up caster levels.
Changed Sanctify Martial strike to be Holy damage.
Changed Vile Martial strike to be Vile damage.
Updated Forsaker to work with Warforged "Armor".
Added a SignalEvent() to Invisible Needle so it would break Invisibility when it should.
Fixed equip exploit with Shou Disciple and monk weapons.
Changed Saint template's Holy Touch to do Holy Damage.
Changed Horrid Wilting to do Desiccation damage.
Fixed Break Enchantment's targeting.
Fixed the Command spell to obey mind immunity.
Changed Damning Darkness to do Unholy damage.
Change the Necrotic spells to do Vile damage.
Made Persistent Blade more like PnP and made it dispellable.
This commit is contained in:
Jaysyn904
2026-06-05 21:33:30 -04:00
parent c437270cd1
commit 306779349c
54 changed files with 614 additions and 167 deletions

View File

@@ -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 ****

View File

@@ -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

View File

@@ -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

View File

@@ -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 **** **** **** **** **** ****

View File

@@ -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

View File

@@ -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

View File

@@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****

View File

@@ -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;
}
}
//:: void main(){}

View File

@@ -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;
}

View File

@@ -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");
}

View File

@@ -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;

View File

@@ -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
//:://////////////////////////////////////////////

View File

@@ -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))

View File

@@ -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;

View File

@@ -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));

View File

@@ -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))

View File

@@ -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, "");

View File

@@ -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)

View File

@@ -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);

View File

@@ -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
}
} */

View File

@@ -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

View File

@@ -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))
{

View File

@@ -98,5 +98,7 @@ void main()
return;
}
SignalEvent(oPC, EventSpellCastAt(oTarget, PRCGetSpellId(), FALSE));
ForceNeedleAttack(oPC, oTarget, nBonus);
}

View File

@@ -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);

View File

@@ -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);

View File

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

View File

@@ -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);

View File

@@ -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));

View File

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

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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

View File

@@ -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());
}

View File

@@ -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))

View File

@@ -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)))

View File

@@ -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));

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

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

View File

@@ -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);

View File

@@ -5393,6 +5393,24 @@ Base Critical Threat: x2
Base Damage Type: Piercing
Weapon Size: Small
Feats Required: Simple</entry>
<entry id="43120" lang="en" sex="m">Sanctified</entry>
<entry id="43121" lang="en" sex="m">Sanctified Damage</entry>
<entry id="43122" lang="en" sex="m">&lt;CUSTOM0&gt; Sanctified</entry>
<entry id="43123" lang="en" sex="m">Holy</entry>
<entry id="43124" lang="en" sex="m">Holy Damage</entry>
<entry id="43125" lang="en" sex="m">&lt;CUSTOM0&gt; Holy</entry>
<entry id="43126" lang="en" sex="m">Unholy</entry>
<entry id="43127" lang="en" sex="m">Unholy Damage</entry>
<entry id="43128" lang="en" sex="m">&lt;CUSTOM0&gt; Unholy</entry>
<entry id="43129" lang="en" sex="m">Falling</entry>
<entry id="43130" lang="en" sex="m">Falling Damage</entry>
<entry id="43131" lang="en" sex="m">&lt;CUSTOM0&gt; Falling</entry>
<entry id="43132" lang="en" sex="m">Ballistic</entry>
<entry id="43133" lang="en" sex="m">Ballistic Damage</entry>
<entry id="43134" lang="en" sex="m">&lt;CUSTOM0&gt; Ballistic</entry>
<entry id="43135" lang="en" sex="m">Dessication</entry>
<entry id="43136" lang="en" sex="m">Dessication Damage</entry>
<entry id="43137" lang="en" sex="m">&lt;CUSTOM0&gt; Dessication</entry>
<entry id="43138" lang="en" sex="m">Untyped</entry>
<entry id="43139" lang="en" sex="m">Untyped Damage</entry>
<entry id="43140" lang="en" sex="m">&lt;CUSTOM0&gt; Untyped</entry>