Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
306779349c | ||
|
|
c437270cd1 | ||
|
|
b27d9d2e5f | ||
|
|
da1ff48ac3 |
@@ -1,3 +1,64 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
Verminlord requires Eldritch Blast as a prereq.
|
||||||
|
Mettle branch in ApplyBreath() is fixed.
|
||||||
|
Zen Archery now applies to Rays / Eldritch Blast.
|
||||||
|
Runes will only support divine spells.
|
||||||
|
School Specialization shouldn't block multiclass Red Wizards of Thay from divine spells in their opposition schools.
|
||||||
|
Scepters, Runes, Skull Talismans & Attuned Gems are considered spell-completion items for RWoT School Specialization.
|
||||||
|
Fixed Acolyte of the Skin's Damage Reduction. For real this time.
|
||||||
|
Sneak Attack now takes Daring Outlaw / Swashbuckler into consideration.
|
||||||
|
|
||||||
|
Commit: Jaysyn904
|
||||||
|
Date: Tues May 26
|
||||||
|
|
||||||
|
Added SoundImpact to Damning Darkness in vfx_persistent.2da.
|
||||||
|
Updated CheckPRCLimitations() to make Darkness, Deeper Darkness & Damning Darkness work better.
|
||||||
|
Fixed PnP Darkness & PnP Damning Darkness.
|
||||||
|
Fixed Oversized Two-Weapon Fighting.
|
||||||
|
Updated TLK for Attune Gem.
|
||||||
|
Fixed typo in Calm Emotions description.
|
||||||
|
|
||||||
|
Commit: Jaysyn904
|
||||||
|
Date: Mon May 25
|
||||||
|
|
||||||
|
Attune Gem was using the wrong prereqs.
|
||||||
|
Attune Gem didn't handle radial spells properly.
|
||||||
|
Attune Gem incorrectly allowed divine spells.
|
||||||
|
Attune Gem was checking the wrong resref for vanilla gems.
|
||||||
|
Attune Gem didn't handle stacks of gems properly.
|
||||||
|
Updated Attune Gem's TLK entry.
|
||||||
|
PRCGetSaveDC() wasn't using PRCGetSpellCastItem().
|
||||||
|
Damning Darkness' vfx_persistent.2da entry was typoed.
|
||||||
|
Damning Darkness was checking the wrong object for inventory item for validity.
|
||||||
|
Darkness invocation was checking the wrong object for inventory item for validity.
|
||||||
|
Deeper Darkness was checking the wrong object for inventory item for validity.
|
||||||
|
Darkness was checking the wrong object for inventory item for validity.
|
||||||
|
Fixed Dragon's Tooth range & save.
|
||||||
|
Hopefully fixed Seize Items' VFX.
|
||||||
|
Fixed Acolyte of the Skin's DR.
|
||||||
|
|
||||||
Commit: Jaysyn904
|
Commit: Jaysyn904
|
||||||
Date: Sun May 24
|
Date: Sun May 24
|
||||||
|
|
||||||
@@ -42,6 +103,7 @@ Fixed taking Ability Focus: Eldritch Blast from bricking a first level character
|
|||||||
Archivist should use INT for epic spell DCs, not WIS.
|
Archivist should use INT for epic spell DCs, not WIS.
|
||||||
Fixed Sublime Chord epic spell DCs.
|
Fixed Sublime Chord epic spell DCs.
|
||||||
|
|
||||||
|
|
||||||
Commit: Jaysyn904
|
Commit: Jaysyn904
|
||||||
Date: Sat May 2 12:46:30 2026
|
Date: Sat May 2 12:46:30 2026
|
||||||
|
|
||||||
|
|||||||
@@ -23,3 +23,9 @@
|
|||||||
19 Force 282 ****
|
19 Force 282 ****
|
||||||
20 Untyped 288 ****
|
20 Untyped 288 ****
|
||||||
21 Vile 84 ****
|
21 Vile 84 ****
|
||||||
|
22 Sanctified 289 ****
|
||||||
|
23 Holy 289 ****
|
||||||
|
24 Unholy 288 ****
|
||||||
|
25 Falling **** ****
|
||||||
|
26 Ballistic **** ****
|
||||||
|
27 Dessication 84 ****
|
||||||
|
|||||||
@@ -11,12 +11,18 @@
|
|||||||
7 Negative 10463 110 3 3
|
7 Negative 10463 110 3 3
|
||||||
8 Positive 10464 176 4 159
|
8 Positive 10464 176 4 159
|
||||||
9 Sonic 10465 120 120 120
|
9 Sonic 10465 120 120 120
|
||||||
10 **** **** **** **** ****
|
10 CEP3_RESERVED **** **** **** ****
|
||||||
11 Poison 16820375 64 255 54
|
11 Poison 16820375 64 255 54
|
||||||
12 **** **** **** **** ****
|
12 CEP3_RESERVED **** **** **** ****
|
||||||
13 Psychic 16820377 133 14 135
|
13 Psychic 16820377 133 14 135
|
||||||
14 **** **** **** **** ****
|
14 CEP3_RESERVED **** **** **** ****
|
||||||
15 Radiant 16820379 227 191 9
|
15 Radiant 16820379 227 191 9
|
||||||
16 Force 16820380 15 209 183
|
16 Force 16820380 95 158 160
|
||||||
17 Untyped 16820354 250 250 250
|
17 Untyped 16820354 250 250 250
|
||||||
18 Vile 16820357 185 32 38
|
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
|
||||||
|
|||||||
@@ -14,13 +14,18 @@
|
|||||||
10 Positive 58310 8
|
10 Positive 58310 8
|
||||||
11 Sonic 58311 9
|
11 Sonic 58311 9
|
||||||
12 Base 58301 0
|
12 Base 58301 0
|
||||||
13 **** **** ****
|
13 CEP3_RESERVED **** ****
|
||||||
14 Poison 16820368 11
|
14 Poison 16820368 11
|
||||||
15 **** **** ****
|
15 CEP3_RESERVED **** ****
|
||||||
16 Psychic 16820370 13
|
16 Psychic 16820370 13
|
||||||
17 **** **** ****
|
17 CEP3_RESERVED **** ****
|
||||||
18 Radiant 16820372 15
|
18 Radiant 16820372 15
|
||||||
19 Force 16820373 16
|
19 Force 16820373 16
|
||||||
20 Untyped 16820355 17
|
20 Untyped 16820355 17
|
||||||
21 Vile 16820358 18
|
21 Vile 16820358 18
|
||||||
22 **** **** ****
|
22 Sanctified 16820337 19
|
||||||
|
23 Holy 16820340 20
|
||||||
|
24 Unholy 16820343 21
|
||||||
|
25 Falling 16820346 22
|
||||||
|
26 Ballistic 16820349 23
|
||||||
|
27 Dessication 16820352 24
|
||||||
|
|||||||
@@ -2248,7 +2248,7 @@
|
|||||||
2244 Dragon_Breath_Prismatic **** **** **** **** **** ****
|
2244 Dragon_Breath_Prismatic **** **** **** **** **** ****
|
||||||
2245 ManyShot **** **** **** **** **** ****
|
2245 ManyShot **** **** **** **** **** ****
|
||||||
2246 ManyShot2 **** **** **** **** **** ****
|
2246 ManyShot2 **** **** **** **** **** ****
|
||||||
2247 Magic_Missile prc_scr_1127 **** **** **** **** ****
|
2247 Major_Missile prc_scr_1127 **** **** **** **** ****
|
||||||
2248 ManyShot4 **** **** **** **** **** ****
|
2248 ManyShot4 **** **** **** **** **** ****
|
||||||
2249 ManyShot6 **** **** **** **** **** ****
|
2249 ManyShot6 **** **** **** **** **** ****
|
||||||
2250 Examine_Recipe **** **** **** **** **** ****
|
2250 Examine_Recipe **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -2248,7 +2248,7 @@
|
|||||||
2244 Dragon_Breath_Prismatic **** 1 1 1 9 0
|
2244 Dragon_Breath_Prismatic **** 1 1 1 9 0
|
||||||
2245 ManyShot **** 1 1 1 1 0
|
2245 ManyShot **** 1 1 1 1 0
|
||||||
2246 ManyShot2 **** 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
|
2248 ManyShot4 **** 1 1 1 1 0
|
||||||
2249 ManyShot6 **** 1 1 1 1 0
|
2249 ManyShot6 **** 1 1 1 1 0
|
||||||
2250 Examine_Recipe **** 1 1 1 1 0
|
2250 Examine_Recipe **** 1 1 1 1 0
|
||||||
|
|||||||
@@ -131,3 +131,5 @@
|
|||||||
127 DAMAGE_IMMUNITY_POSITIVE_DECREASE ief_DamImmDecrp 85560
|
127 DAMAGE_IMMUNITY_POSITIVE_DECREASE ief_DamImmDecrp 85560
|
||||||
128 DAMAGE_IMMUNITY_SONIC_DECREASE ief_DamImmDecrs 85561
|
128 DAMAGE_IMMUNITY_SONIC_DECREASE ief_DamImmDecrs 85561
|
||||||
129 WOUNDING ief_Wounding 86782
|
129 WOUNDING ief_Wounding 86782
|
||||||
|
130 DARKVISION ief_darkvis 1493
|
||||||
|
131 ULTRAVISION ief_ultravis 6331
|
||||||
|
|||||||
@@ -5324,7 +5324,7 @@
|
|||||||
5320 EttercapBerserker 16826796 16826797 ife_wildshape **** **** **** **** **** **** **** **** 293 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
5320 EttercapBerserker 16826796 16826797 ife_wildshape **** **** **** **** **** **** **** **** 293 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||||
5321 IceTrollBerserker 16826798 16826799 ife_X2ArSkin **** **** **** **** **** 13 **** **** 293 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
5321 IceTrollBerserker 16826798 16826799 ife_X2ArSkin **** **** **** **** **** 13 **** **** 293 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||||
5322 WolfBerserker 16826800 16826801 ife_animal **** **** **** **** **** **** **** **** 293 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
5322 WolfBerserker 16826800 16826801 ife_animal **** **** **** **** **** **** **** **** 293 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||||
5323 Verminlord 16836682 16836683 ife_X1PoisSav **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3795 **** 1 -1 **** **** **** **** **** **** **** 16 24 **** **** FEAT_MASTER_OF_THE_ELEMENTS 5 **** **** **** **** **** 1 0
|
5323 Verminlord 16836682 16836683 ife_X1PoisSav **** **** **** **** **** **** **** **** 4460 **** 0 0 0 **** **** 3795 **** 1 -1 **** **** **** **** **** **** **** 16 24 **** **** FEAT_VERMINLORD 5 **** **** **** **** **** 1 0
|
||||||
5324 DespanaSchool 16836696 16836697 ife_X2CritDHalb 5 **** **** **** **** **** **** **** 28 94 0 0 1 22 **** 3798 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_DESPANA_SCHOOL 6 1 **** **** **** **** 0 1
|
5324 DespanaSchool 16836696 16836697 ife_X2CritDHalb 5 **** **** **** **** **** **** **** 28 94 0 0 1 22 **** 3798 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_DESPANA_SCHOOL 6 1 **** **** **** **** 0 1
|
||||||
5325 Crinti_ShadowRide 16823084 16823085 spi_dimdoor **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3799 **** **** 5 **** **** **** **** **** **** **** **** **** **** **** FEAT_BLADE_MEDITATION **** **** **** **** **** **** **** 1
|
5325 Crinti_ShadowRide 16823084 16823085 spi_dimdoor **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3799 **** **** 5 **** **** **** **** **** **** **** **** **** **** **** FEAT_BLADE_MEDITATION **** **** **** **** **** **** **** 1
|
||||||
5326 Crinti_ShadowWalk 16823086 16823087 is_teleport **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3800 **** **** 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_BLADE_MEDITATION **** **** **** **** **** **** **** 1
|
5326 Crinti_ShadowWalk 16823086 16823087 is_teleport **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3800 **** **** 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_BLADE_MEDITATION **** **** **** **** **** **** **** 1
|
||||||
|
|||||||
@@ -25,3 +25,9 @@
|
|||||||
21 16820366 Force 0.55 28
|
21 16820366 Force 0.55 28
|
||||||
22 16820354 Untyped 0.55 8
|
22 16820354 Untyped 0.55 8
|
||||||
23 16820357 Vile 0.55 9
|
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
|
||||||
|
|||||||
@@ -2092,7 +2092,7 @@
|
|||||||
2088 SPELL_AP_SMITEGOOD 3779 ife_X1SmGood V T vs 0x00 0x02 apal_smitegood **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2088 SPELL_AP_SMITEGOOD 3779 ife_X1SmGood V T vs 0x00 0x02 apal_smitegood **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2089 SPELL_AP_AURAFEAR 16825579 is_GenAura V P vs 0x00 0x01 apal_aurafear **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2089 SPELL_AP_AURAFEAR 16825579 is_GenAura V P vs 0x00 0x01 apal_aurafear **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2090 SPELL_INTUTIVATK 16825914 is_X2Darkfire V P vs 0x00 0x03 prc_intuiatk **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 3 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2090 SPELL_INTUTIVATK 16825914 is_X2Darkfire V P vs 0x00 0x03 prc_intuiatk **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 3 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2091 Blacklight 16825540 is_Darkness V S vs 0x3a 0x2f sp_blacklight **** **** **** **** **** 3 3 1500 head **** **** vco_grndpurp sco_megrdodd01 vs_chant_evoc_lm vs_chant_evoc_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16825541 1 0 **** 0 **** **** **** 0 **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** ****
|
2091 Blacklight 16825540 is_Darkness V S vs 0x3a 0x2f sp_blacklight **** **** **** **** **** 3 3 1500 head **** **** vco_grndpurp sco_megrdodd01 vs_chant_evoc_lm vs_chant_evoc_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16825541 1 0 **** 0 **** **** **** 0 sphere 6.096 **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2092 DarkBolt 16825538 is_RayEnfeeb V M vs 0x3d 0x2A **** **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 2093 2094 **** **** **** 2 **** 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** 3 **** **** **** **** **** **** **** **** **** **** ****
|
2092 DarkBolt 16825538 is_RayEnfeeb V M vs 0x3d 0x2A **** **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 2093 2094 **** **** **** 2 **** 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** 3 **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2093 DarkBolt_all 16825542 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2093 DarkBolt_all 16825542 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2094 DarkBolt_1 16825543 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt1 **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2094 DarkBolt_1 16825543 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt1 **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -2536,7 +2536,7 @@
|
|||||||
2532 CLUTCH_OF_ORCUS 16829500 is_clutch_orcus N M vs 0x38 0x0a sp_clutch_orcus **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL02 **** SCO_LGRINEVIL01 VS_CHANT_NECR_HM vs_chant_necr_hf out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829501 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2532 CLUTCH_OF_ORCUS 16829500 is_clutch_orcus N M vs 0x38 0x0a sp_clutch_orcus **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL02 **** SCO_LGRINEVIL01 VS_CHANT_NECR_HM vs_chant_necr_hf out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829501 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2533 CRUSHING_FIST_OF_SPITE 16829502 is_crush_fs V M vs 0x3a 0x0c sp_crush_fs **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF up 1000 **** **** **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829503 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2533 CRUSHING_FIST_OF_SPITE 16829502 is_crush_fs V M vs 0x3a 0x0c sp_crush_fs **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF up 1000 **** **** **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829503 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2534 CURSE_OF_THE_PUTRID_HUSK 16829504 is_curse_phusk I S vs 0x3a 0x0a sp_curse_phusk 3 **** **** **** **** 3 3 1500 hand **** VCO_MEHANODD03 **** SCO_LGSPRODD01 VS_CHANT_ILLU_HM VS_CHANT_ILLU_HF out 1000 **** VCA_OUTMIND01 **** SCA_OUTMIND01 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16829505 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2534 CURSE_OF_THE_PUTRID_HUSK 16829504 is_curse_phusk I S vs 0x3a 0x0a sp_curse_phusk 3 **** **** **** **** 3 3 1500 hand **** VCO_MEHANODD03 **** SCO_LGSPRODD01 VS_CHANT_ILLU_HM VS_CHANT_ILLU_HF out 1000 **** VCA_OUTMIND01 **** SCA_OUTMIND01 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16829505 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2535 DAMNING_DARKNESS 16829506 is_damng_dark V T v 0x1a 0x2f sp_damng_dark **** 4 **** **** **** 4 4 1500 hand **** VCO_MEHANEVIL02 **** SCO_MEHANEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF touch 1000 **** **** **** SDR_BLACKOUT 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829507 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2535 DAMNING_DARKNESS 16829506 is_damng_dark V T v 0x3f 0x2f sp_damng_dark **** 4 **** **** **** 4 4 1500 hand **** VCO_MEHANEVIL02 **** SCO_MEHANEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF touch 1000 **** **** **** SDR_BLACKOUT 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829507 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2536 DEATH_BY_THORNS 16829508 is_dth_thorns C T vs 0x38 0x06 sp_dth_thorns **** 7 7 **** **** 7 7 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 VCO_MEHEDEVIL01 **** **** **** 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829509 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7 **** 7 ****
|
2536 DEATH_BY_THORNS 16829508 is_dth_thorns C T vs 0x38 0x06 sp_dth_thorns **** 7 7 **** **** 7 7 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 VCO_MEHEDEVIL01 **** **** **** 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829509 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7 **** 7 ****
|
||||||
2537 DEMONCALL 16829510 is_demoncall D P vs 0x38 0x09 sp_demoncall **** **** **** **** **** **** 2 1500 head VCO_MEHEDEVIL01 **** VCO_GRNDRED SCO_LGRINEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF up 1000 **** **** **** sdr_demonhand 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829511 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** ****
|
2537 DEMONCALL 16829510 is_demoncall D P vs 0x38 0x09 sp_demoncall **** **** **** **** **** **** 2 1500 head VCO_MEHEDEVIL01 **** VCO_GRNDRED SCO_LGRINEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF up 1000 **** **** **** sdr_demonhand 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829511 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** ****
|
||||||
2538 DEMONFLESH 16829512 is_demonflesh T P vs 0x3a 0x09 sp_demonflesh **** **** **** **** **** **** 1 1500 head VCO_MEHEDEVIL01 **** **** SCO_LGSPREVIL01 VS_CHANT_CONJ_LM VS_CHANT_CONJ_LF self 1000 **** **** VCA_UPHEXEVIL01 SDR_PARALYZED 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829513 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** ****
|
2538 DEMONFLESH 16829512 is_demonflesh T P vs 0x3a 0x09 sp_demonflesh **** **** **** **** **** **** 1 1500 head VCO_MEHEDEVIL01 **** **** SCO_LGSPREVIL01 VS_CHANT_CONJ_LM VS_CHANT_CONJ_LF self 1000 **** **** VCA_UPHEXEVIL01 SDR_PARALYZED 0 **** **** **** **** **** **** 1 **** **** **** **** **** 10 **** 1 16829513 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** ****
|
||||||
@@ -2593,7 +2593,7 @@
|
|||||||
2589 TOUCH_OF_JUIBLEX 16829600 is_tch_Juiblex T T vs 0x38 0x0a sp_tch_Juiblex **** 3 3 **** 3 3 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_LM VS_CHANT_NECR_LF touch 1000 **** VCA_OUTEVIL01 **** sdr_darkness 0 **** **** **** **** **** **** 1 **** **** **** **** **** 3 **** 1 16829601 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** 3 **** 3 **** 3 **** **** **** 3 **** 3 ****
|
2589 TOUCH_OF_JUIBLEX 16829600 is_tch_Juiblex T T vs 0x38 0x0a sp_tch_Juiblex **** 3 3 **** 3 3 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_LM VS_CHANT_NECR_LF touch 1000 **** VCA_OUTEVIL01 **** sdr_darkness 0 **** **** **** **** **** **** 1 **** **** **** **** **** 3 **** 1 16829601 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** 3 **** 3 **** 3 **** **** **** 3 **** 3 ****
|
||||||
2590 UNHEAVENED 16829602 is_unheavened A T vs 0x38 0x0a sp_unheavened **** **** **** **** **** 2 2 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTEVIL01 **** adr_freemove 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829603 1 0 **** 0 **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2590 UNHEAVENED 16829602 is_unheavened A T vs 0x38 0x0a sp_unheavened **** **** **** **** **** 2 2 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTEVIL01 **** adr_freemove 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829603 1 0 **** 0 **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2591 UNLIVING_WEAPON 16829604 is_unliv_weap N T vs 0x3d 0x0a sp_unliv_weap **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_NECR_HM VS_CHANT_NECR_HF touch 1000 **** VCA_OUTEVIL01 **** sce_negative 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829605 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2591 UNLIVING_WEAPON 16829604 is_unliv_weap N T vs 0x3d 0x0a sp_unliv_weap **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_NECR_HM VS_CHANT_NECR_HF touch 1000 **** VCA_OUTEVIL01 **** sce_negative 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829605 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2592 UTTERDARK 16829606 is_utterdark C P vs 0x3a 0x09 sp_utterdark **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEHEDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 **** **** **** SDR_DARKNESS 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829607 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2592 UTTERDARK 16829606 is_utterdark C P vs 0x3a 0x09 sp_utterdark **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEHEDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 **** **** **** SDR_DARKNESS 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829607 1 0 **** 0 **** **** **** **** sphere 30.48 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2593 WAVE_OF_GRIEF 16829608 is_wave_grief E S s 0x2a 0x0e sp_wave_grief 2 2 **** **** **** **** 2 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_ENCH_HM VS_CHANT_ENCH_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829609 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2593 WAVE_OF_GRIEF 16829608 is_wave_grief E S s 0x2a 0x0e sp_wave_grief 2 2 **** **** **** **** 2 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_ENCH_HM VS_CHANT_ENCH_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829609 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2594 WAVE_OF_PAIN 16829610 is_wave_pain N S s 0x2a 0x0c sp_wave_pain 6 **** **** **** **** **** 6 1500 hand **** VCO_MEHANEVIL01 **** SCO_GAZEEVIL VS_CHANT_NECR_HM VS_CHANT_NECR_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829611 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2594 WAVE_OF_PAIN 16829610 is_wave_pain N S s 0x2a 0x0c sp_wave_pain 6 **** **** **** **** **** 6 1500 hand **** VCO_MEHANEVIL01 **** SCO_GAZEEVIL VS_CHANT_NECR_HM VS_CHANT_NECR_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829611 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2595 WRACK 16829612 is_wrack N S vs 0x3a 0x0a sp_wrack **** 3 **** **** **** 4 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_HM VS_CHANT_NECR_HF out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829613 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2595 WRACK 16829612 is_wrack N S vs 0x3a 0x0a sp_wrack **** 3 **** **** **** 4 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_HM VS_CHANT_NECR_HF out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829613 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
19339 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
19340 Shadow_Conjuration_Conversation 16790387 is_ShadConj I P s **** 0x01 shdconj_convrun **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 24732 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -170,7 +170,7 @@
|
|||||||
166 AOE_PER_DESERT_TEMPEST C 1.3 **** **** tob_dw_dsttmpta **** **** 0 274 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
166 AOE_PER_DESERT_TEMPEST C 1.3 **** **** tob_dw_dsttmpta **** **** 0 274 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
167 AOE_MOB_MOUNTAIN_AVALANCHE C 1 **** **** tob_stdr_mtavlA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
167 AOE_MOB_MOUNTAIN_AVALANCHE C 1 **** **** tob_stdr_mtavlA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
168 VFX_PER_SNARE C 3.048 **** **** sp_snareA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
168 VFX_PER_SNARE C 3.048 **** **** sp_snareA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
169 AOE_PER_PYROTECHNICS_SMOKE C 6.096 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
169 AOE_PER_PYROTECHNICS_SMOKE C 6.096 **** **** sp_pyrotechnicsA sp_pyrotechnicsB **** **** **** vpr_gas vps_fogmind vim_mentcloud 3 3 3 3400 1100 1900 0 0 0.25 **** sps_fog_loop **** sps_fog 0.3 vpr_gas_L vpr_gas_L vpr_gas_L
|
||||||
170 AOE_PER_FIRE_TRAP C 1.524 **** **** sp_fire_trapA **** **** 0 **** vps_delfireb vps_delfireb vps_delfireb 5 5 5 3400 1100 1900 0 0 0.25 **** sps_delfireb **** **** **** vps_delfireb_L vps_delfireb_L vps_delfireb_L
|
170 AOE_PER_FIRE_TRAP C 1.524 **** **** sp_fire_trapA **** **** 0 **** vps_delfireb vps_delfireb vps_delfireb 5 5 5 3400 1100 1900 0 0 0.25 **** sps_delfireb **** **** **** vps_delfireb_L vps_delfireb_L vps_delfireb_L
|
||||||
171 VFX_PER_PRISMATIC_WALL R **** 15 1 sp_prism_wallA **** **** **** 891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
171 VFX_PER_PRISMATIC_WALL R **** 15 1 sp_prism_wallA **** **** **** 891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
172 VFX_MOB_RING_OF_BLADES C 1.524 **** **** sp_ring_bldsa **** sp_ring_bldsc **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
172 VFX_MOB_RING_OF_BLADES C 1.524 **** **** sp_ring_bldsa **** sp_ring_bldsc **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -204,9 +204,9 @@
|
|||||||
200 VFX_PER_FOGFREEZE C 5 **** **** **** **** **** 0 **** vps_fogfreeze vps_fogfreeze vps_fogfreeze 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogfreeze_L vps_fogfreeze_L vps_fogfreeze_L
|
200 VFX_PER_FOGFREEZE C 5 **** **** **** **** **** 0 **** vps_fogfreeze vps_fogfreeze vps_fogfreeze 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogfreeze_L vps_fogfreeze_L vps_fogfreeze_L
|
||||||
201 VFX_PER_FOGYELLOW C 5 **** **** **** **** **** 0 **** vps_fogyell vps_fogyell vps_fogyell 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogyell_L vps_fogyell_L vps_fogyell_L
|
201 VFX_PER_FOGYELLOW C 5 **** **** **** **** **** 0 **** vps_fogyell vps_fogyell vps_fogyell 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogyell_L vps_fogyell_L vps_fogyell_L
|
||||||
202 VFX_PER_FOGPURPLE C 5 **** **** **** **** **** 0 **** vps_fogpurp vps_fogpurp vps_fogpurp 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogpurp_L vps_fogpurp_L vps_fogpurp_L
|
202 VFX_PER_FOGPURPLE C 5 **** **** **** **** **** 0 **** vps_fogpurp vps_fogpurp vps_fogpurp 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogpurp_L vps_fogpurp_L vps_fogpurp_L
|
||||||
203 AOE_PER_DAMNDARK C 6.7 **** **** sp_damng_darka sp_damng_darkb **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
203 AOE_PER_DAMNDARK C 6.7 **** **** sp_damng_darka sp_damng_darkb **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
|
||||||
204 VFX_MOB_BRILLIANT_EMANATION C 30.48 **** **** sp_brill_emanA sp_brill_emanB **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
204 VFX_MOB_BRILLIANT_EMANATION C 30.48 **** **** sp_brill_emanA sp_brill_emanB **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
205 VFX_PER_UTTERDARK C 50 **** **** sp_utterdarkA sp_utterdarkB **** 0 844 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
|
205 VFX_PER_UTTERDARK C 30.48 **** **** sp_utterdarkA sp_utterdarkB **** 0 844 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
|
||||||
206 VFX_PER_ACHAIERAI C 3.048 **** **** sp_cloud_achai sp_cloud_achaiB **** 0 845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
206 VFX_PER_ACHAIERAI C 3.048 **** **** sp_cloud_achai sp_cloud_achaiB **** 0 845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
207 VFX_PER_WALLFROST R **** 10 2 sp_wallfrosta **** sp_wallfrostc 0 **** vps_wallfrost vps_wallfrost vps_wallfrost 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallfrost_L vps_wallfrost_L vps_wallfrost_L
|
207 VFX_PER_WALLFROST R **** 10 2 sp_wallfrosta **** sp_wallfrostc 0 **** vps_wallfrost vps_wallfrost vps_wallfrost 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallfrost_L vps_wallfrost_L vps_wallfrost_L
|
||||||
208 VFX_PER_WALLGRN R **** 10 2 **** **** **** 0 **** vps_wallgrn vps_wallgrn vps_wallgrn 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallgrn_L vps_wallgrn_L vps_wallgrn_L
|
208 VFX_PER_WALLGRN R **** 10 2 **** **** **** 0 **** vps_wallgrn vps_wallgrn vps_wallgrn 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallgrn_L vps_wallgrn_L vps_wallgrn_L
|
||||||
|
|||||||
BIN
nwn/nwnprc/trunk/gfx/ief_ultravis.tga
Normal file
BIN
nwn/nwnprc/trunk/gfx/ief_ultravis.tga
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/gfx/im_thicketblades.tga
Normal file
BIN
nwn/nwnprc/trunk/gfx/im_thicketblades.tga
Normal file
Binary file not shown.
@@ -362,6 +362,17 @@ string GetBindingClassFile(int nClass)
|
|||||||
|
|
||||||
void ApplyVestige(object oBinder, int nVestige)
|
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);
|
PRCRemoveSpellEffects(nVestige, oBinder, oBinder);
|
||||||
GZPRCRemoveSpellEffects(nVestige, oBinder, FALSE);
|
GZPRCRemoveSpellEffects(nVestige, oBinder, FALSE);
|
||||||
ActionCastSpellOnSelf(nVestige, METAMAGIC_NONE, oBinder);
|
ActionCastSpellOnSelf(nVestige, METAMAGIC_NONE, oBinder);
|
||||||
@@ -393,6 +404,17 @@ void ApplyVestige(object oBinder, int nVestige)
|
|||||||
|
|
||||||
void ExpelVestige(object oBinder, int nVestige)
|
void ExpelVestige(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);
|
||||||
|
}
|
||||||
|
|
||||||
SetPersistantLocalInt(oBinder, "ExpelledVestige", TRUE);
|
SetPersistantLocalInt(oBinder, "ExpelledVestige", TRUE);
|
||||||
SetPersistantLocalInt(oBinder, "ExpelledVestige"+IntToString(nVestige), TRUE);
|
SetPersistantLocalInt(oBinder, "ExpelledVestige"+IntToString(nVestige), TRUE);
|
||||||
// Here, making a good pack means we can unbind it
|
// Here, making a good pack means we can unbind it
|
||||||
@@ -966,3 +988,5 @@ int GetPatronVestige(object oBinder)
|
|||||||
|
|
||||||
return nPatron;
|
return nPatron;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: void main(){}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ void RemoveTSFromObject(object oTarget)
|
|||||||
|| nSpellId == 14205 // POWER_TEMPORALACCELERATION
|
|| nSpellId == 14205 // POWER_TEMPORALACCELERATION
|
||||||
|| nSpellId == 17366 // MOVE_DM_MOMENT_ALACRITY
|
|| nSpellId == 17366 // MOVE_DM_MOMENT_ALACRITY
|
||||||
|| nSpellId == 17511 // MOVE_WR_WHITE_RAVEN_TACTICS
|
|| nSpellId == 17511 // MOVE_WR_WHITE_RAVEN_TACTICS
|
||||||
|
|| nSpellId == 18428 // MYST_SHADOW_TIME
|
||||||
)
|
)
|
||||||
RemoveEffect(oTarget, eTest);
|
RemoveEffect(oTarget, eTest);
|
||||||
eTest = GetNextEffect(oTarget);
|
eTest = GetNextEffect(oTarget);
|
||||||
@@ -81,3 +82,5 @@ void RemoveTSFromObject(object oTarget)
|
|||||||
StopFade(oTarget);
|
StopFade(oTarget);
|
||||||
SetCommandable(TRUE, oTarget);
|
SetCommandable(TRUE, oTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//void main(){}
|
||||||
@@ -465,7 +465,7 @@ int GetInvokerLevel(object oInvoker = OBJECT_SELF, int nSpecificClass = CLASS_TY
|
|||||||
if(nLevel)
|
if(nLevel)
|
||||||
{
|
{
|
||||||
if(DEBUG) SendMessageToPC(oInvoker, "Forced-level Invoking at level " + IntToString(GetCasterLevel(oInvoker)));
|
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;
|
return nLevel + nAdjust;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2235,6 +2235,7 @@ const int FEAT_INSECT_PLAGUE = 2312; //CONSTANT
|
|||||||
const int FEAT_SUMMON_CORNUGON = 2313; //CONSTANT
|
const int FEAT_SUMMON_CORNUGON = 2313; //CONSTANT
|
||||||
const int FEAT_BEGUILEING_NATURE = 2314; //CONSTANT
|
const int FEAT_BEGUILEING_NATURE = 2314; //CONSTANT
|
||||||
|
|
||||||
|
//:: Fist of Hextor Feats
|
||||||
const int FEAT_DEVICE_LORE = 2333;
|
const int FEAT_DEVICE_LORE = 2333;
|
||||||
const int FEAT_IRON_HEWS = 2334;
|
const int FEAT_IRON_HEWS = 2334;
|
||||||
const int FEAT_RUSTING_GRASP = 2335;
|
const int FEAT_RUSTING_GRASP = 2335;
|
||||||
@@ -2245,6 +2246,9 @@ const int FEAT_GREATER_IRON_HEWS = 2339;
|
|||||||
const int FEAT_IRON_SKIN = 2340;
|
const int FEAT_IRON_SKIN = 2340;
|
||||||
const int FEAT_IRON_BODY = 2341;
|
const int FEAT_IRON_BODY = 2341;
|
||||||
|
|
||||||
|
//:: Telflammar Shadowlord Feats
|
||||||
|
const int FEAT_SHADOWDISCORPO = 3305;
|
||||||
|
|
||||||
const int FEAT_COFFIN_SANCTUARY = 2343;
|
const int FEAT_COFFIN_SANCTUARY = 2343;
|
||||||
const int FEAT_GASEOUS_FORM = 2344;
|
const int FEAT_GASEOUS_FORM = 2344;
|
||||||
|
|
||||||
|
|||||||
@@ -795,10 +795,14 @@ void ApplyBreath(struct breath BreathUsed, location lTargetArea, int bLinger = F
|
|||||||
{
|
{
|
||||||
//Mettle is Evasion for Fort saves
|
//Mettle is Evasion for Fort saves
|
||||||
if (GetHasMettle(oTarget, SAVING_THROW_FORT))
|
if (GetHasMettle(oTarget, SAVING_THROW_FORT))
|
||||||
|
{
|
||||||
nAdjustedDamage = 0;
|
nAdjustedDamage = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
nAdjustedDamage /= 2;
|
nAdjustedDamage /= 2;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
nAdjustedDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nSaveDC, nSaveDamageType);
|
nAdjustedDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nSaveDC, nSaveDamageType);
|
||||||
|
|||||||
@@ -3760,8 +3760,19 @@ int GetAttackBonus(object oDefender, object oAttacker, object oWeap, int iOffhan
|
|||||||
iAbilityBonus = iWis;
|
iAbilityBonus = iWis;
|
||||||
|
|
||||||
//touch attacks always use dex, no matter what. Therefore override any calculations we have done so far
|
//touch attacks always use dex, no matter what. Therefore override any calculations we have done so far
|
||||||
|
//unless it's a ranged touch attack and the attacker has Zen Archery with higher WIS
|
||||||
if(iTouchAttackType)
|
if(iTouchAttackType)
|
||||||
|
{
|
||||||
|
if((iTouchAttackType == TOUCH_ATTACK_RANGED || iTouchAttackType == TOUCH_ATTACK_RANGED_SPELL)
|
||||||
|
&& iWis > iDex && GetHasFeat(FEAT_ZEN_ARCHERY, oAttacker))
|
||||||
|
iAbilityBonus = iWis;
|
||||||
|
else
|
||||||
iAbilityBonus = iDex;
|
iAbilityBonus = iDex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* //touch attacks always use dex, no matter what. Therefore override any calculations we have done so far
|
||||||
|
if(iTouchAttackType)
|
||||||
|
iAbilityBonus = iDex; */
|
||||||
|
|
||||||
// Expertise penalties apply to all attack rolls
|
// Expertise penalties apply to all attack rolls
|
||||||
if (iCombatMode == COMBAT_MODE_EXPERTISE) iCombatModeBonus -= 5;
|
if (iCombatMode == COMBAT_MODE_EXPERTISE) iCombatModeBonus -= 5;
|
||||||
@@ -8792,7 +8803,9 @@ void AttackLoopMain(object oDefender, object oAttacker,
|
|||||||
if(DEBUG) DoDebug("Entered AttackLoopMain: bonus attacks = " + IntToString(iBonusAttacks)+", main attacks = "+IntToString(iMainAttacks)+", offhand attacks = "+IntToString(iOffHandAttacks));
|
if(DEBUG) DoDebug("Entered AttackLoopMain: bonus attacks = " + IntToString(iBonusAttacks)+", main attacks = "+IntToString(iMainAttacks)+", offhand attacks = "+IntToString(iOffHandAttacks));
|
||||||
|
|
||||||
// ugly workaround to make this global available for other functions after a call to DelayCommand or AssignCommand
|
// ugly workaround to make this global available for other functions after a call to DelayCommand or AssignCommand
|
||||||
bUseMonkAttackMod = sAttackVars.bUseMonkAttackMod;
|
//bUseMonkAttackMod = sAttackVars.bUseMonkAttackMod;
|
||||||
|
|
||||||
|
sAttackVars.bUseMonkAttackMod = GetHasMonkWeaponEquipped(oAttacker);
|
||||||
|
|
||||||
// turn off touch attack if var says it only applies to first attack
|
// turn off touch attack if var says it only applies to first attack
|
||||||
if (sAttackVars.iAttackNumber && !sAttackVars.bApplyTouchToAll) sAttackVars.iTouchAttackType == FALSE;
|
if (sAttackVars.iAttackNumber && !sAttackVars.bApplyTouchToAll) sAttackVars.iTouchAttackType == FALSE;
|
||||||
|
|||||||
@@ -657,6 +657,53 @@ int PRCGetIsRealSpellKnown(int nRealSpellID, object oPC = OBJECT_SELF)
|
|||||||
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
|
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
|
||||||
// this will only check the spellbook of the class specified
|
// this will only check the spellbook of the class specified
|
||||||
int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJECT_SELF)
|
int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJECT_SELF)
|
||||||
|
{
|
||||||
|
// check for whether bard and sorc are using the prc spellbooks
|
||||||
|
if (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
|
||||||
|
{
|
||||||
|
if (!UseNewSpellBook(oPC))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the cls_spell_***.2da index for the real spell
|
||||||
|
int nSpellbookSpell = RealSpellToSpellbookID(nClass, nRealSpellID);
|
||||||
|
if (nSpellbookSpell == -1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
string sFile = GetFileForClass(nClass);
|
||||||
|
string sSpellLevel = Get2DACache(sFile, "Level", nSpellbookSpell);
|
||||||
|
if (sSpellLevel == "")
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int nSpellLevel = StringToInt(sSpellLevel);
|
||||||
|
int nSpellbookType = GetSpellbookTypeForClass(nClass);
|
||||||
|
|
||||||
|
// Check whether the class can actually cast spells of this circle.
|
||||||
|
int nCasterLevel = GetSpellslotLevel(nClass, oPC);
|
||||||
|
int nAbility = GetAbilityScoreForClass(nClass, oPC);
|
||||||
|
if (GetSlotCount(nCasterLevel, nSpellLevel, nAbility, nClass, oPC) <= 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
// Prepared casters know their full list, except Archivist.
|
||||||
|
if (nSpellbookType == SPELLBOOK_TYPE_PREPARED && nClass != CLASS_TYPE_ARCHIVIST)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Spontaneous casters only know spells they've actually learned.
|
||||||
|
if (nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
|
||||||
|
{
|
||||||
|
int nFeatID = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookSpell));
|
||||||
|
if (GetHasFeat(nFeatID, oPC))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// checks if oPC knows the specified spell
|
||||||
|
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
|
||||||
|
// this will only check the spellbook of the class specified
|
||||||
|
/* int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJECT_SELF)
|
||||||
{
|
{
|
||||||
// check for whether bard and sorc are using the prc spellbooks
|
// check for whether bard and sorc are using the prc spellbooks
|
||||||
if (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
|
if (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
|
||||||
@@ -692,7 +739,7 @@ int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJ
|
|||||||
// at this stage, prepared casters know the spell and only spontaneous classes need checking
|
// at this stage, prepared casters know the spell and only spontaneous classes need checking
|
||||||
// there are exceptions and these need hardcoding:
|
// there are exceptions and these need hardcoding:
|
||||||
|
|
||||||
if((GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_PREPARED) && nClass != CLASS_TYPE_ARCHIVIST)
|
/* if((GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_PREPARED) && nClass != CLASS_TYPE_ARCHIVIST)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
// spontaneous casters have all their known spells as hide feats
|
// spontaneous casters have all their known spells as hide feats
|
||||||
@@ -703,6 +750,7 @@ int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJ
|
|||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
//routes to action cast spell, but puts a wrapper around to tell other functions its a
|
//routes to action cast spell, but puts a wrapper around to tell other functions its a
|
||||||
//SLA, so dont craft etc
|
//SLA, so dont craft etc
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ void SetupCharacterData(object oPC)
|
|||||||
case CLASS_TYPE_SHADOWSMITH: iData |= 0x01; break;
|
case CLASS_TYPE_SHADOWSMITH: iData |= 0x01; break;
|
||||||
case CLASS_TYPE_SHADOW_SUN_NINJA: sScript = "tob_shadowsun"; break;
|
case CLASS_TYPE_SHADOW_SUN_NINJA: sScript = "tob_shadowsun"; break;
|
||||||
case CLASS_TYPE_SHADOWBLADE: sScript = "prc_sb_shdstlth"; break;
|
case CLASS_TYPE_SHADOWBLADE: sScript = "prc_sb_shdstlth"; break;
|
||||||
|
case CLASS_TYPE_SHADOWLORD: sScript = "prc_shadowlord"; break;
|
||||||
case CLASS_TYPE_SHADOWMIND: sScript = "psi_shadowmind"; break;
|
case CLASS_TYPE_SHADOWMIND: sScript = "psi_shadowmind"; break;
|
||||||
case CLASS_TYPE_SHADOWBANE_STALKER: sScript = "prc_shadstalker"; break;
|
case CLASS_TYPE_SHADOWBANE_STALKER: sScript = "prc_shadstalker"; break;
|
||||||
case CLASS_TYPE_SHADOW_THIEF_AMN: sScript = "prc_amn"; break;
|
case CLASS_TYPE_SHADOW_THIEF_AMN: sScript = "prc_amn"; break;
|
||||||
|
|||||||
@@ -459,6 +459,31 @@ int CheckPRCLimitations(object oItem, object oPC = OBJECT_INVALID)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(ipType == ITEM_PROPERTY_AREA_OF_EFFECT)
|
else if(ipType == ITEM_PROPERTY_AREA_OF_EFFECT)
|
||||||
|
{
|
||||||
|
// This should happen on equip, unequip, or dynamic IP addition
|
||||||
|
if(bEquip || bUnequip || !bEquip && !bUnequip)
|
||||||
|
{
|
||||||
|
// Remove existing AoE
|
||||||
|
effect eTest = GetFirstEffect(oPC);
|
||||||
|
while(GetIsEffectValid(eTest))
|
||||||
|
{
|
||||||
|
if(GetEffectCreator(eTest) == oItem
|
||||||
|
&& GetEffectType(eTest) == EFFECT_TYPE_AREA_OF_EFFECT)
|
||||||
|
{
|
||||||
|
RemoveEffect(oPC, eTest);
|
||||||
|
if(DEBUG) DoDebug("CheckPRCLimitations: Removing old AoE effect");
|
||||||
|
}
|
||||||
|
eTest = GetNextEffect(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create new AoE - Skip when unequipping
|
||||||
|
if(!bUnequip)
|
||||||
|
{
|
||||||
|
AssignCommand(oItem, _prc_inc_itmrstr_ApplyAoE(oPC, oItem, GetItemPropertySubType(ipTest), GetItemPropertyCostTable(ipTest)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* else if(ipType == ITEM_PROPERTY_AREA_OF_EFFECT)
|
||||||
{
|
{
|
||||||
|
|
||||||
// This should only happen on equip or unequip
|
// This should only happen on equip or unequip
|
||||||
@@ -483,7 +508,7 @@ int CheckPRCLimitations(object oItem, object oPC = OBJECT_INVALID)
|
|||||||
AssignCommand(oItem, _prc_inc_itmrstr_ApplyAoE(oPC, oItem, GetItemPropertySubType(ipTest), GetItemPropertyCostTable(ipTest)));
|
AssignCommand(oItem, _prc_inc_itmrstr_ApplyAoE(oPC, oItem, GetItemPropertySubType(ipTest), GetItemPropertyCostTable(ipTest)));
|
||||||
}// end if - Equip event
|
}// end if - Equip event
|
||||||
}// end if - Equip or Unequip event
|
}// end if - Equip or Unequip event
|
||||||
}// end if - AoE iprp
|
}// end if - AoE iprp */
|
||||||
else if(ipType == ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N)
|
else if(ipType == ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N)
|
||||||
{
|
{
|
||||||
// Only equippable items can provide bonus spell slots
|
// Only equippable items can provide bonus spell slots
|
||||||
|
|||||||
@@ -20,6 +20,26 @@
|
|||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a linked effect bundle containing Shadowlord ultravision,
|
||||||
|
* visual feedback effects, and concealment for higher Shadowlord levels.
|
||||||
|
*
|
||||||
|
* @param iShadow
|
||||||
|
* Shadowlord level of the target creature.
|
||||||
|
*
|
||||||
|
* @param eBaseEffect
|
||||||
|
* Existing linked effect bundle to append effects to.
|
||||||
|
* Typically ePnP, eLink, or eLink2.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* Updated linked effect bundle containing:
|
||||||
|
* - Ultravision
|
||||||
|
* - Ultravision icon
|
||||||
|
* - Magical sight visuals
|
||||||
|
* - Positive effect visuals
|
||||||
|
* - 20% concealment at Shadowlord level 2+
|
||||||
|
*/
|
||||||
|
effect ShadowlordEffects(int iShadow, effect eBaseEffect);
|
||||||
|
|
||||||
|
|
||||||
//:: Calculates total Shield AC bonuses from all sources
|
//:: Calculates total Shield AC bonuses from all sources
|
||||||
@@ -381,6 +401,30 @@ const int TYPE_DIVINE = -2;
|
|||||||
/* Function definitions */
|
/* Function definitions */
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
effect ShadowlordEffects(int iShadow, effect eBaseEffect)
|
||||||
|
{
|
||||||
|
|
||||||
|
//:: Create visual feedback effect link
|
||||||
|
effect eVis = EffectVisualEffect(VFX_DUR_ULTRAVISION);
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectIcon(EFFECT_ICON_ULTRAVISION));
|
||||||
|
|
||||||
|
//:: Link Ultravision and visual feedback into base effect
|
||||||
|
eBaseEffect = EffectLinkEffects(eBaseEffect, EffectUltravision());
|
||||||
|
eBaseEffect = EffectLinkEffects(eBaseEffect, eVis);
|
||||||
|
if(DEBUG) DoDebug("ShadowlordEffects() >> Setting up Ultravision");
|
||||||
|
|
||||||
|
if (iShadow > 1)
|
||||||
|
{
|
||||||
|
//;: Add concealment for level 2+ Shadowlords
|
||||||
|
eBaseEffect = EffectLinkEffects(eBaseEffect, EffectConcealment(20));
|
||||||
|
if(DEBUG) DoDebug("ShadowlordEffects() >> Setting up Concealment");
|
||||||
|
}
|
||||||
|
|
||||||
|
return eBaseEffect;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Returns TRUE if nSpellID is a subradial spell, FALSE otherwise
|
// Returns TRUE if nSpellID is a subradial spell, FALSE otherwise
|
||||||
int GetIsSubradialSpell(int nSpellID)
|
int GetIsSubradialSpell(int nSpellID)
|
||||||
@@ -2627,7 +2671,7 @@ void DoPiercingCold(object oCaster, object oTarget, int nDamageAmount, int nCurr
|
|||||||
if (nDamageAmount > nTest)
|
if (nDamageAmount > nTest)
|
||||||
{
|
{
|
||||||
// Apply the difference to ignore resist
|
// 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);
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
||||||
effect eVis = EffectVisualEffect(VFX_IMP_FROST_L);
|
effect eVis = EffectVisualEffect(VFX_IMP_FROST_L);
|
||||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||||
@@ -2742,13 +2786,13 @@ effect PRCEffectDamage(object oTarget, int nDamageAmount, int nDamageType=DAMAGE
|
|||||||
{
|
{
|
||||||
int nDice = (iDiabolistLevel + 5) / 5;
|
int nDice = (iDiabolistLevel + 5) / 5;
|
||||||
int nDamage = d6(nDice);
|
int nDamage = d6(nDice);
|
||||||
int nDamageType = DAMAGE_TYPE_DIVINE;
|
int nDamageType = DAMAGE_TYPE_UNHOLY;
|
||||||
|
|
||||||
if(GetLocalInt(oCaster, "VileDiabolism"))
|
if(GetLocalInt(oCaster, "VileDiabolism"))
|
||||||
{
|
{
|
||||||
//FloatingTextStringOnCreature("Vile Diabolism is active", oCaster, FALSE);
|
//FloatingTextStringOnCreature("Vile Diabolism is active", oCaster, FALSE);
|
||||||
nDamage /= 2;
|
nDamage /= 2;
|
||||||
nDamageType = DAMAGE_TYPE_POSITIVE;
|
nDamageType = DAMAGE_TYPE_VILE;
|
||||||
DeleteLocalInt(oCaster, "VileDiabolism");
|
DeleteLocalInt(oCaster, "VileDiabolism");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
|
|
||||||
/* This variable MUST be updated with every new version of the PRC!!! */
|
/* This variable MUST be updated with every new version of the PRC!!! */
|
||||||
|
|
||||||
const string PRC_VERSION = "PRC8 4.91";
|
const string PRC_VERSION = "PRC8 4.92";
|
||||||
|
|
||||||
/* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */
|
/* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ const string PRC_PNP_FIND_TRAPS = "PRC_PNP_FIND_TRAPS";
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* PnP Darkness
|
* PnP Darkness
|
||||||
* Is a mobile AOE based off an item
|
* Is a mobile AOE based off an item when cast on a creature.
|
||||||
*/
|
*/
|
||||||
const string PRC_PNP_DARKNESS = "PRC_PNP_DARKNESS";
|
const string PRC_PNP_DARKNESS = "PRC_PNP_DARKNESS";
|
||||||
|
|
||||||
|
|||||||
@@ -1143,6 +1143,15 @@ void DoWeaponEquip(object oPC, object oItem, int nHand)
|
|||||||
if (!bIsRestricted)
|
if (!bIsRestricted)
|
||||||
{
|
{
|
||||||
if (GetHasFeat(FEAT_OTWF, oPC))
|
if (GetHasFeat(FEAT_OTWF, oPC))
|
||||||
|
{
|
||||||
|
// When wielding a one-handed weapon in your off hand, you take penalties for fighting with two weapons as if you were wielding a light weapon in your off hand
|
||||||
|
if (nWeaponSize == nRealSize && nHand == ATTACK_BONUS_OFFHAND)
|
||||||
|
{
|
||||||
|
SetCompositeAttackBonus(oPC, "OTWFL", 2, ATTACK_BONUS_OFFHAND);
|
||||||
|
SetCompositeAttackBonus(oPC, "OTWFR", 2, ATTACK_BONUS_ONHAND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* if (GetHasFeat(FEAT_OTWF, oPC))
|
||||||
{
|
{
|
||||||
// When wielding a one-handed weapon in your off hand, you take penalties for fighting with two weapons as if you were wielding a light weapon in your off hand
|
// When wielding a one-handed weapon in your off hand, you take penalties for fighting with two weapons as if you were wielding a light weapon in your off hand
|
||||||
if (nWeaponSize == nRealSize && nHand == ATTACK_BONUS_OFFHAND)
|
if (nWeaponSize == nRealSize && nHand == ATTACK_BONUS_OFFHAND)
|
||||||
@@ -1156,7 +1165,7 @@ void DoWeaponEquip(object oPC, object oItem, int nHand)
|
|||||||
SetCompositeAttackBonus(oPC, "OTWFR", 0, ATTACK_BONUS_ONHAND);
|
SetCompositeAttackBonus(oPC, "OTWFR", 0, ATTACK_BONUS_ONHAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
//check for proficiency
|
//check for proficiency
|
||||||
|
|||||||
@@ -900,14 +900,16 @@ const int IP_CONST_ONHIT_SAVEDC_70 = 70;
|
|||||||
// Creature Epic Criticals
|
// Creature Epic Criticals
|
||||||
const int IP_CONST_FEAT_DEVCRITICAL_CREATURE = 271;
|
const int IP_CONST_FEAT_DEVCRITICAL_CREATURE = 271;
|
||||||
const int IP_CONST_FEAT_OVERCRITICAL_CREATURE = 272;
|
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
|
// Epic DR
|
||||||
const int IP_CONST_FEAT_EPIC_DR_3 = 273;
|
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_6 = 274;
|
||||||
const int IP_CONST_FEAT_EPIC_DR_9 = 275;
|
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_BLOOD = 15; //:: Not a 3e PnP damage type
|
||||||
const int IP_CONST_DAMAGETYPE_POISON = 16;
|
const int IP_CONST_DAMAGETYPE_POISON = 16;
|
||||||
//const int IP_CONST_DAMAGETYPE_SHADOW = 17; //:: Not a 3e PnP damage type
|
//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_FORCE = 21;
|
||||||
const int IP_CONST_DAMAGETYPE_UNTYPED = 22;
|
const int IP_CONST_DAMAGETYPE_UNTYPED = 22;
|
||||||
const int IP_CONST_DAMAGETYPE_VILE = 23;
|
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
|
//IP_CONST_DAMAGESOAK
|
||||||
const int IP_CONST_DAMAGESOAK_1_HP = 11;
|
const int IP_CONST_DAMAGESOAK_1_HP = 11;
|
||||||
|
|||||||
@@ -4,8 +4,31 @@
|
|||||||
* but aren't numerous enough to warrant their own.
|
* but aren't numerous enough to warrant their own.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:: New base item types
|
//:: New effect icons (effecticons.2da)
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
const int EFFECT_ICON_DARKVISION = 130;
|
||||||
|
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_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
|
||||||
|
|
||||||
|
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: New base item types
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
const int BASE_ITEM_GOLEM = 23; //:: not actually used for anything else
|
const int BASE_ITEM_GOLEM = 23; //:: not actually used for anything else
|
||||||
|
|||||||
@@ -1727,6 +1727,24 @@ int InscribeRune(object oTarget = OBJECT_INVALID, object oCaster = OBJECT_INVALI
|
|||||||
if(!GetIsObjectValid(oTarget)) oTarget = PRCGetSpellTargetObject();
|
if(!GetIsObjectValid(oTarget)) oTarget = PRCGetSpellTargetObject();
|
||||||
int nCaster = GetAlternativeCasterLevel(oCaster, PRCGetCasterLevel(oCaster));
|
int nCaster = GetAlternativeCasterLevel(oCaster, PRCGetCasterLevel(oCaster));
|
||||||
|
|
||||||
|
// Get the spell and class
|
||||||
|
if(!nSpell) nSpell = PRCGetSpellId();
|
||||||
|
int nLastClass = PRCGetLastSpellCastClass();
|
||||||
|
|
||||||
|
// Check if the casting class is divine
|
||||||
|
if (!GetIsDivineClass(nLastClass))
|
||||||
|
{
|
||||||
|
FloatingTextStringOnCreature("Inscribe Rune can only be used with divine spells.", oCaster, FALSE);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the spell is on the caster's divine spell list
|
||||||
|
if (!GetHasSpellOnClassList(oCaster, nSpell))
|
||||||
|
{
|
||||||
|
FloatingTextStringOnCreature("You must have this spell on your divine spell list to inscribe it.", oCaster, FALSE);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
//:: Check for Inscribe Epic Runes and cap CL at 20 if it doesn't exist.
|
//:: Check for Inscribe Epic Runes and cap CL at 20 if it doesn't exist.
|
||||||
int bEpicRunes = GetHasFeat(EPIC_FEAT_INSCRIBE_EPIC_RUNES, oCaster);
|
int bEpicRunes = GetHasFeat(EPIC_FEAT_INSCRIBE_EPIC_RUNES, oCaster);
|
||||||
if (!bEpicRunes) { if(nCaster > 20) nCaster = 20; }
|
if (!bEpicRunes) { if(nCaster > 20) nCaster = 20; }
|
||||||
@@ -1744,7 +1762,6 @@ int InscribeRune(object oTarget = OBJECT_INVALID, object oCaster = OBJECT_INVALI
|
|||||||
// Runecraft local int that counts uses/charges
|
// Runecraft local int that counts uses/charges
|
||||||
int nCount = GetLocalInt(oCaster, "RuneCounter");
|
int nCount = GetLocalInt(oCaster, "RuneCounter");
|
||||||
|
|
||||||
int nLastClass = PRCGetLastSpellCastClass();
|
|
||||||
if (nLastClass == CLASS_TYPE_CLERIC || nLastClass == CLASS_TYPE_UR_PRIEST) nSpellLevel = StringToInt(lookup_spell_cleric_level(nSpell));
|
if (nLastClass == CLASS_TYPE_CLERIC || nLastClass == CLASS_TYPE_UR_PRIEST) nSpellLevel = StringToInt(lookup_spell_cleric_level(nSpell));
|
||||||
else if (nLastClass == CLASS_TYPE_DRUID) nSpellLevel = StringToInt(lookup_spell_druid_level(nSpell));
|
else if (nLastClass == CLASS_TYPE_DRUID) nSpellLevel = StringToInt(lookup_spell_druid_level(nSpell));
|
||||||
else if (nLastClass == CLASS_TYPE_WIZARD || nLastClass == CLASS_TYPE_SORCERER) nSpellLevel = StringToInt(lookup_spell_level(nSpell));
|
else if (nLastClass == CLASS_TYPE_WIZARD || nLastClass == CLASS_TYPE_SORCERER) nSpellLevel = StringToInt(lookup_spell_level(nSpell));
|
||||||
@@ -3624,31 +3641,6 @@ int CICraftCheckCreateInfusion(object oSpellTarget, object oCaster, int nID = 0)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* // -------------------------------------------------------------------------
|
|
||||||
// Create the infused herb item
|
|
||||||
// -------------------------------------------------------------------------
|
|
||||||
object oInfusion = CICreateInfusion(oCaster, nID);
|
|
||||||
|
|
||||||
if (GetIsObjectValid(oInfusion))
|
|
||||||
{
|
|
||||||
SetIdentified(oInfusion, TRUE);
|
|
||||||
ActionPlayAnimation(ANIMATION_FIREFORGET_READ, 1.0);
|
|
||||||
SpendXP(oCaster, costs.nXPCost);
|
|
||||||
SpendGP(oCaster, costs.nGoldCost);
|
|
||||||
DestroyObject(oSpellTarget);
|
|
||||||
FloatingTextStrRefOnCreature(8502, oCaster); // Item creation successful
|
|
||||||
|
|
||||||
if (!costs.nTimeCost) costs.nTimeCost = 1;
|
|
||||||
AdvanceTimeForPlayer(oCaster, RoundsToSeconds(costs.nTimeCost));
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FloatingTextStringOnCreature("Infusion creation failed", oCaster); // Item creation failed
|
|
||||||
FloatingTextStrRefOnCreature(76417, oCaster); // Item creation failed
|
|
||||||
return TRUE;
|
|
||||||
} */
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ float GetVFXLength(location lCaster, float fLength, float fAngle)
|
|||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:: Modified March 14 2003: Removed the option to hurt chests/doors
|
//:: Modified March 14 2003: Removed the option to hurt chests/doors
|
||||||
//:: was potentially causing bugs when no creature targets available.
|
//:: 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;
|
object oTarget = OBJECT_INVALID;
|
||||||
int nCasterLvl = PRCGetCasterLevel(OBJECT_SELF);
|
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;
|
int i = 0;
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
// GZ: Moved SR check out of loop to have 1 check per target
|
// 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
|
// apart
|
||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,nCasterLvl, fDelay))
|
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,nCasterLvl, fDelay))
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ const int MANEUVER_TYPE_MANEUVER = 5;
|
|||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
int GetHasActiveStanceOfDiscipline(object oInitiator, int nDiscipline);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines from what class's maneuver list the currently being initiated
|
* Determines from what class's maneuver list the currently being initiated
|
||||||
* maneuver is initiated from.
|
* maneuver is initiated from.
|
||||||
@@ -481,6 +484,34 @@ int _AllowedDiscipline(object oInitiator, int nClass, int nDiscipline)
|
|||||||
/* Function definitions */
|
/* 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)
|
int GetInitiatingClass(object oInitiator = OBJECT_SELF)
|
||||||
{
|
{
|
||||||
return GetLocalInt(oInitiator, PRC_INITIATING_CLASS) - 1;
|
return GetLocalInt(oInitiator, PRC_INITIATING_CLASS) - 1;
|
||||||
|
|||||||
@@ -948,6 +948,71 @@ int SpellAlignmentRestrictions(object oCaster, int nSpellID, int nCastingClass)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int RedWizRestrictedSchool(object oCaster, int nSchool, int nCastingClass, object oSpellCastItem)
|
int RedWizRestrictedSchool(object oCaster, int nSchool, int nCastingClass, object oSpellCastItem)
|
||||||
|
{
|
||||||
|
// No need for wasting CPU on non-Red Wizards
|
||||||
|
if(GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster))
|
||||||
|
{
|
||||||
|
//can't cast prohibited spells from scrolls, wands, infused herbs, scepters, runes, gems, or skull talismans
|
||||||
|
if(GetIsObjectValid(oSpellCastItem))
|
||||||
|
{
|
||||||
|
int nType = GetBaseItemType(oSpellCastItem);
|
||||||
|
string sTag = GetTag(oSpellCastItem);
|
||||||
|
|
||||||
|
// Check base item types for standard items
|
||||||
|
if(nType != BASE_ITEM_MAGICWAND
|
||||||
|
&& nType != BASE_ITEM_ENCHANTED_WAND
|
||||||
|
&& nType != BASE_ITEM_SCROLL
|
||||||
|
&& nType != BASE_ITEM_SPELLSCROLL
|
||||||
|
&& nType != BASE_ITEM_ENCHANTED_SCROLL
|
||||||
|
&& nType != BASE_ITEM_INFUSED_HERB
|
||||||
|
&& nType != BASE_ITEM_CRAFTED_SCEPTER) // ADD THIS LINE
|
||||||
|
{
|
||||||
|
// Check tags for custom crafted items
|
||||||
|
if(sTag != "prc_rune_1"
|
||||||
|
&& sTag != "prc_attunegem"
|
||||||
|
&& sTag != "prc_skulltalis")
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Direct casting: skip restriction for divine classes
|
||||||
|
if(GetIsDivineClass(nCastingClass))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine forbidden schools
|
||||||
|
int iRWRes;
|
||||||
|
switch(nSchool)
|
||||||
|
{
|
||||||
|
case SPELL_SCHOOL_ABJURATION: iRWRes = FEAT_RW_RES_ABJ; break;
|
||||||
|
case SPELL_SCHOOL_CONJURATION: iRWRes = FEAT_RW_RES_CON; break;
|
||||||
|
case SPELL_SCHOOL_DIVINATION: iRWRes = FEAT_RW_RES_DIV; break;
|
||||||
|
case SPELL_SCHOOL_ENCHANTMENT: iRWRes = FEAT_RW_RES_ENC; break;
|
||||||
|
case SPELL_SCHOOL_EVOCATION: iRWRes = FEAT_RW_RES_EVO; break;
|
||||||
|
case SPELL_SCHOOL_ILLUSION: iRWRes = FEAT_RW_RES_ILL; break;
|
||||||
|
case SPELL_SCHOOL_NECROMANCY: iRWRes = FEAT_RW_RES_NEC; break;
|
||||||
|
case SPELL_SCHOOL_TRANSMUTATION: iRWRes = FEAT_RW_RES_TRS; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compare the spell's school versus the restricted schools
|
||||||
|
if(iRWRes && GetHasFeat(iRWRes, oCaster))
|
||||||
|
{
|
||||||
|
FloatingTextStrRefOnCreature(16822359, oCaster, FALSE); // "You cannot cast spells of your prohibited schools. Spell terminated."
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// Other arcane casters cannot benefit from red wizard bonuses
|
||||||
|
if(GetIsArcaneClass(nCastingClass) && nCastingClass != CLASS_TYPE_WIZARD)
|
||||||
|
{
|
||||||
|
FloatingTextStringOnCreature("You have attempted to illegaly merge another arcane caster with a Red Wizard. All spellcasting will now fail.", oCaster, FALSE);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* int RedWizRestrictedSchool(object oCaster, int nSchool, int nCastingClass, object oSpellCastItem)
|
||||||
{
|
{
|
||||||
// No need for wasting CPU on non-Red Wizards
|
// No need for wasting CPU on non-Red Wizards
|
||||||
if(GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster))
|
if(GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster))
|
||||||
@@ -994,7 +1059,7 @@ int RedWizRestrictedSchool(object oCaster, int nSchool, int nCastingClass, objec
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
int PnPSpellSchools(object oCaster, int nCastingClass, int nSchool, object oSpellCastItem)
|
int PnPSpellSchools(object oCaster, int nCastingClass, int nSchool, object oSpellCastItem)
|
||||||
{
|
{
|
||||||
if(GetPRCSwitch(PRC_PNP_SPELL_SCHOOLS)
|
if(GetPRCSwitch(PRC_PNP_SPELL_SCHOOLS)
|
||||||
@@ -2665,6 +2730,40 @@ void X2BreakConcentrationSpells()
|
|||||||
//end Dragonsong Lyrist songs
|
//end Dragonsong Lyrist songs
|
||||||
DeleteLocalInt(OBJECT_SELF, "SpellConc");
|
DeleteLocalInt(OBJECT_SELF, "SpellConc");
|
||||||
|
|
||||||
|
if(GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER))
|
||||||
|
{
|
||||||
|
//this is also in summon HB
|
||||||
|
//but needed here to handle quickend spells
|
||||||
|
//Disintegrate is cast from the blade so doesn't end the summon
|
||||||
|
|
||||||
|
// Determine the correct tag based on PRC switch
|
||||||
|
string sTargetTag = GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER) ? "prc_bbod001" : "x2_s_bblade";
|
||||||
|
|
||||||
|
// Loop through all summoned associates
|
||||||
|
int i = 1;
|
||||||
|
object oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF, i);
|
||||||
|
while(GetIsObjectValid(oAssoc))
|
||||||
|
{
|
||||||
|
string sTag = GetTag(oAssoc);
|
||||||
|
// Use case-insensitive comparison
|
||||||
|
if(GetStringLowerCase(sTag) == GetStringLowerCase(sTargetTag))
|
||||||
|
{
|
||||||
|
if(GetLocalInt(oAssoc, "X2_L_CREATURE_NEEDS_CONCENTRATION"))
|
||||||
|
{
|
||||||
|
SignalEvent(oAssoc, EventUserDefined(X2_EVENT_CONCENTRATION_BROKEN));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* void X2BreakConcentrationSpells()
|
||||||
|
{
|
||||||
|
//end Dragonsong Lyrist songs
|
||||||
|
DeleteLocalInt(OBJECT_SELF, "SpellConc");
|
||||||
|
|
||||||
if(GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER))
|
if(GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER))
|
||||||
{
|
{
|
||||||
//this is also in summon HB
|
//this is also in summon HB
|
||||||
@@ -2682,7 +2781,7 @@ void X2BreakConcentrationSpells()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} */
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// being hit by any kind of negative effect affecting the caster's ability to concentrate
|
// being hit by any kind of negative effect affecting the caster's ability to concentrate
|
||||||
|
|||||||
@@ -444,6 +444,23 @@ void main()
|
|||||||
MarkStageNotSetUp(STAGE_EXPLOIT_VESTIGE, 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_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);
|
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);
|
ClearCurrentStage(oBinder);
|
||||||
MarkStageNotSetUp(STAGE_ASTAROTH, oBinder);
|
MarkStageNotSetUp(STAGE_ASTAROTH, oBinder);
|
||||||
}
|
} */
|
||||||
|
|
||||||
if(DEBUG) DoDebug("bnd_bindingcnv: New stage: " + IntToString(nStage));
|
if(DEBUG) DoDebug("bnd_bindingcnv: New stage: " + IntToString(nStage));
|
||||||
|
|
||||||
|
|||||||
@@ -54,18 +54,18 @@ void main()
|
|||||||
|
|
||||||
nDC += InvokerAbilityFocus(oPC, nEssence, nEssence2);
|
nDC += InvokerAbilityFocus(oPC, nEssence, nEssence2);
|
||||||
|
|
||||||
int nDamageType = nEssence ? (nEssenceData >>> 4) & 0xFFF : DAMAGE_TYPE_MAGICAL;
|
int nDamageType = nEssence ? (nEssenceData >>> 4) & 0xFFF : DAMAGE_TYPE_UNTYPED;
|
||||||
int nDamageType2 = nEssence2 ? (nEssenceData2 >>> 4) & 0xFFF : DAMAGE_TYPE_MAGICAL;
|
int nDamageType2 = nEssence2 ? (nEssenceData2 >>> 4) & 0xFFF : DAMAGE_TYPE_UNTYPED;
|
||||||
|
|
||||||
//Set correct blast damage type
|
//Set correct blast damage type
|
||||||
if(nDamageType != nDamageType2)
|
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;
|
nDamageType2 = nDamageType;
|
||||||
}
|
}
|
||||||
else if(nDamageType2 != DAMAGE_TYPE_MAGICAL)
|
else if(nDamageType2 != DAMAGE_TYPE_UNTYPED)
|
||||||
{
|
{
|
||||||
nDamageType = nDamageType2;
|
nDamageType = nDamageType2;
|
||||||
}
|
}
|
||||||
@@ -117,17 +117,6 @@ void main()
|
|||||||
LosePsionicFocus();
|
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);
|
int nAtkBns = GetAttackBonus(oTarget, oPC, OBJECT_INVALID, FALSE, TOUCH_ATTACK_RANGED_SPELL);
|
||||||
if(GetHasFeat(FEAT_ELDRITCH_SCULPTOR))
|
if(GetHasFeat(FEAT_ELDRITCH_SCULPTOR))
|
||||||
nAtkBns += 2;
|
nAtkBns += 2;
|
||||||
|
|||||||
@@ -108,6 +108,12 @@ void main()
|
|||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(9999), oCaster);
|
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, "");
|
Teleport(oCaster, nCasterLvl, nSpellID == INVOKE_PATH_OF_SHADOW_PARTY, FALSE, "");
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,49 @@
|
|||||||
/*
|
/*
|
||||||
Warlock epic feat
|
Warlock epic feat
|
||||||
Verminlord dominating vermin
|
Verminlord dominating vermin
|
||||||
|
|
||||||
|
Fixed By: Jaysyn
|
||||||
|
Date: 2026-05-27 19:43:38
|
||||||
*/
|
*/
|
||||||
#include "prc_inc_racial"
|
#include "prc_inc_racial"
|
||||||
#include "inv_inc_invfunc"
|
#include "inv_inc_invfunc"
|
||||||
|
#include "prc_inc_spells"
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
object oTarget = PRCGetSpellTargetObject();
|
object oTarget = PRCGetSpellTargetObject();
|
||||||
int nRacialType = MyPRCGetRacialType(oTarget);
|
int nRacialType = MyPRCGetRacialType(oTarget);
|
||||||
|
|
||||||
|
if(nRacialType != RACIAL_TYPE_VERMIN)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int nCasterLevel = GetInvokerLevel(OBJECT_SELF, CLASS_TYPE_WARLOCK);
|
||||||
|
int nDuration = nCasterLevel;
|
||||||
|
|
||||||
|
// Spell resistance check
|
||||||
|
if(PRCDoResistSpell(OBJECT_SELF, oTarget, nCasterLevel))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Will save (but not as mind-affecting for vermin)
|
||||||
|
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, OBJECT_SELF), SAVING_THROW_TYPE_NONE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Apply supernatural domination effect that bypasses mind immunity
|
||||||
|
effect eDom = SupernaturalEffect(EffectCutsceneDominated());
|
||||||
|
effect eVis = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED);
|
||||||
|
effect eLink = EffectLinkEffects(eDom, eVis);
|
||||||
|
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration), TRUE, -1, nCasterLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* void main()
|
||||||
|
{
|
||||||
|
object oTarget = PRCGetSpellTargetObject();
|
||||||
|
int nRacialType = MyPRCGetRacialType(oTarget);
|
||||||
|
|
||||||
if(nRacialType != RACIAL_TYPE_VERMIN)
|
if(nRacialType != RACIAL_TYPE_VERMIN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DoRacialSLA(SPELL_DOMINATE_MONSTER, GetInvokerLevel(OBJECT_SELF, CLASS_TYPE_WARLOCK));
|
DoRacialSLA(SPELL_DOMINATE_MONSTER, GetInvokerLevel(OBJECT_SELF, CLASS_TYPE_WARLOCK));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
@@ -29,6 +29,14 @@ void main()
|
|||||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||||
effect eLink = EffectLinkEffects(eDark, eDur);
|
effect eLink = EffectLinkEffects(eDark, eDur);
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
||||||
|
|
||||||
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow))
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow))
|
||||||
|
|||||||
@@ -24,6 +24,17 @@ void main()
|
|||||||
object oTarget = GetExitingObject();
|
object oTarget = GetExitingObject();
|
||||||
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("shd_myst_dskdwnb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
// Loop over effects, removing the ones from this power
|
// Loop over effects, removing the ones from this power
|
||||||
effect eAOE;
|
effect eAOE;
|
||||||
if(GetHasSpellEffect(MYST_DUSK_AND_DAWN_DUSK, oTarget) || GetHasSpellEffect(FUND_BLACK_CANDLE_DARK, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_DR, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_NEG, oTarget))
|
if(GetHasSpellEffect(MYST_DUSK_AND_DAWN_DUSK, oTarget) || GetHasSpellEffect(FUND_BLACK_CANDLE_DARK, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_DR, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_NEG, oTarget))
|
||||||
|
|||||||
@@ -37,6 +37,14 @@ void main()
|
|||||||
|
|
||||||
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST);
|
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST);
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow) && GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL) != TRUE)
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow) && GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL) != TRUE)
|
||||||
{
|
{
|
||||||
//Fire cast spell at event for the target
|
//Fire cast spell at event for the target
|
||||||
|
|||||||
@@ -28,6 +28,18 @@ void main()
|
|||||||
|
|
||||||
// Loop over effects, removing the ones from this power
|
// Loop over effects, removing the ones from this power
|
||||||
effect eAOE;
|
effect eAOE;
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
if(GetHasSpellEffect(MYST_GRASPING_SHADOWS, oTarget))
|
if(GetHasSpellEffect(MYST_GRASPING_SHADOWS, oTarget))
|
||||||
{
|
{
|
||||||
//Search through the valid effects on the target.
|
//Search through the valid effects on the target.
|
||||||
|
|||||||
@@ -22,6 +22,22 @@
|
|||||||
|
|
||||||
// Called on Heartbeat
|
// 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
|
// Needs an active Shadow Hands stance
|
||||||
int nStance = GetHasActiveStance(oInitiator);
|
int nStance = GetHasActiveStance(oInitiator);
|
||||||
@@ -39,7 +55,7 @@ void ShadowBlade(object oInitiator)
|
|||||||
SetLocalInt(oInitiator, "ShadowBladeDam", nDex);
|
SetLocalInt(oInitiator, "ShadowBladeDam", nDex);
|
||||||
DelayCommand(6.0, DeleteLocalInt(oInitiator, "ShadowBladeDam"));
|
DelayCommand(6.0, DeleteLocalInt(oInitiator, "ShadowBladeDam"));
|
||||||
}
|
}
|
||||||
}
|
} */
|
||||||
|
|
||||||
// Called on Heartbeat
|
// Called on Heartbeat
|
||||||
void RapidAssault(object oInitiator)
|
void RapidAssault(object oInitiator)
|
||||||
@@ -119,6 +135,25 @@ void BladeMeditation(object oInitiator)
|
|||||||
|
|
||||||
// Called on Heartbeat
|
// 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));
|
int nDisc = GetDisciplineByManeuver(GetHasActiveStance(oInitiator));
|
||||||
if (nDisc == DISCIPLINE_IRON_HEART)
|
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);
|
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} */
|
||||||
|
|
||||||
// Called on heartbeat
|
// 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
|
// Needs an active Shadow Hands stance
|
||||||
int nStance = GetHasActiveStance(oInitiator);
|
int nStance = GetHasActiveStance(oInitiator);
|
||||||
@@ -152,7 +197,7 @@ void ShadowTrickster(object oInitiator)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
DeleteLocalInt(oInitiator, "ShadowTrickster");
|
DeleteLocalInt(oInitiator, "ShadowTrickster");
|
||||||
}
|
} */
|
||||||
|
|
||||||
// Called on Heartbeat
|
// Called on Heartbeat
|
||||||
void WhiteRavenDefense(object oInitiator)
|
void WhiteRavenDefense(object oInitiator)
|
||||||
|
|||||||
@@ -67,6 +67,14 @@ void main()
|
|||||||
{// Applies to everyone
|
{// Applies to everyone
|
||||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 6.0);
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 6.0);
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
oTarget = GetNextObjectInShape(SHAPE_SPHERE, FeetToMeters(60.0), GetLocation(oInitiator));
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, FeetToMeters(60.0), GetLocation(oInitiator));
|
||||||
}
|
}
|
||||||
// Give oInitiator a little graphic
|
// Give oInitiator a little graphic
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -131,7 +131,7 @@ void DoPower(struct manifestation manif, object oMainTarget, int nDC, int nPen,
|
|||||||
nDamage = MetaPsionicsDamage(manif, nDieSize, nNumberOfDice, 0, 0, TRUE, FALSE);
|
nDamage = MetaPsionicsDamage(manif, nDieSize, nNumberOfDice, 0, 0, TRUE, FALSE);
|
||||||
// Target-specific stuff
|
// Target-specific stuff
|
||||||
nDamage = GetTargetSpecificChangesToDamage(oAreaTarget, manif.oManifester, nDamage, TRUE, FALSE);
|
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, eDamage, oAreaTarget);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oAreaTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oAreaTarget);
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ void main()
|
|||||||
{
|
{
|
||||||
int nDamage = 5 + manif.nTimesAugOptUsed_1;
|
int nDamage = 5 + manif.nTimesAugOptUsed_1;
|
||||||
effect eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
|
effect eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
|
||||||
float fDuration = 60.0f * manif.nManifesterLevel;
|
float fDuration = 600.0f * manif.nManifesterLevel;
|
||||||
if(manif.bExtend) fDuration *= 2;
|
if(manif.bExtend) fDuration *= 2;
|
||||||
|
|
||||||
// Get the OnHitCast: Unique on the target's armor / hide
|
// Get the OnHitCast: Unique on the target's armor / hide
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
You mentally push a foe, attempting to knock it prone and disarm it. The DC
|
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
|
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
|
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.
|
disarmed are rolled separately.
|
||||||
|
|
||||||
Augment: For every 2 additional power points spent, the DC of the Discipline
|
Augment: For every 2 additional power points spent, the DC of the Discipline
|
||||||
@@ -33,9 +33,70 @@
|
|||||||
#include "psi_inc_pwresist"
|
#include "psi_inc_pwresist"
|
||||||
#include "psi_spellhook"
|
#include "psi_spellhook"
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
|
#include "prc_inc_combmove" // Add this include
|
||||||
|
|
||||||
void main()
|
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
|
Spellcast Hook Code
|
||||||
Added 2004-11-02 by Stratovarius
|
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
|
// If code within the PrePowerCastHook (i.e. UMD) reports FALSE, do not run this spell
|
||||||
return;
|
return;
|
||||||
@@ -102,4 +163,4 @@ void main()
|
|||||||
}// end if - SR check
|
}// end if - SR check
|
||||||
}// end for - Twin Power
|
}// end for - Twin Power
|
||||||
}// end if - Successfull manifestation
|
}// end if - Successfull manifestation
|
||||||
}
|
} */
|
||||||
|
|||||||
@@ -61,13 +61,13 @@ void Sanctify()
|
|||||||
|
|
||||||
if(!Sanctify_Feat_Wrapper(iType, oPC, oItem)) return;
|
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");
|
ip1 = TagItemProperty(ip1,"Sanctify1");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
|
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");
|
ip2 = TagItemProperty(ip2,"Sanctify2");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
|
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");
|
ip3 = TagItemProperty(ip3,"Sanctify3");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
||||||
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
||||||
@@ -108,9 +108,9 @@ void Sanctify()
|
|||||||
|
|
||||||
if(GetLocalInt(oItem,"SanctMar"))
|
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_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_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_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_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_HOLY,DURATION_TYPE_TEMPORARY);
|
||||||
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"SanctMar");
|
DeleteLocalInt(oItem,"SanctMar");
|
||||||
}
|
}
|
||||||
@@ -144,17 +144,17 @@ void Sanctify()
|
|||||||
|
|
||||||
if ( GetLocalInt(oItem,"SanctMar"))
|
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_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_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_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_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_HOLY, DURATION_TYPE_TEMPORARY);
|
||||||
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"SanctMar");
|
DeleteLocalInt(oItem,"SanctMar");
|
||||||
}
|
}
|
||||||
if ( GetLocalInt(oItem2,"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_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_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_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_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_HOLY, DURATION_TYPE_TEMPORARY);
|
||||||
RemoveSpecificProperty(oItem2,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
RemoveSpecificProperty(oItem2,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem2,"SanctMar");
|
DeleteLocalInt(oItem2,"SanctMar");
|
||||||
}
|
}
|
||||||
@@ -183,13 +183,13 @@ void Sanctify()
|
|||||||
|
|
||||||
if(Sanctify_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"SanctMar")))
|
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");
|
ip1 = TagItemProperty(ip1,"Sanctify1");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
|
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");
|
ip2 = TagItemProperty(ip2,"Sanctify2");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
|
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");
|
ip3 = TagItemProperty(ip3,"Sanctify3");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
||||||
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
||||||
@@ -202,13 +202,13 @@ void Sanctify()
|
|||||||
iType= GetBaseItemType(oItem);
|
iType= GetBaseItemType(oItem);
|
||||||
if(Sanctify_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"SanctMar")))
|
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");
|
ip1 = TagItemProperty(ip1,"Sanctify1");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip1,oItem,9999.0);
|
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");
|
ip2 = TagItemProperty(ip2,"Sanctify2");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip2,oItem,9999.0);
|
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");
|
ip3 = TagItemProperty(ip3,"Sanctify3");
|
||||||
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ip3,oItem,9999.0);
|
||||||
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
itemproperty ip4 = ItemPropertyVisualEffect(ITEM_VISUAL_HOLY);
|
||||||
@@ -269,7 +269,7 @@ void Vile()
|
|||||||
if(nAlign > 7)
|
if(nAlign > 7)
|
||||||
AdjustAlignment(oPC, ALIGNMENT_EVIL, 7, FALSE);
|
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);
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
|
||||||
SetLocalInt(oItem,"USanctMar",1);
|
SetLocalInt(oItem,"USanctMar",1);
|
||||||
}
|
}
|
||||||
@@ -305,7 +305,7 @@ void Vile()
|
|||||||
|
|
||||||
if ( GetLocalInt(oItem,"USanctMar"))
|
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);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"USanctMar");
|
DeleteLocalInt(oItem,"USanctMar");
|
||||||
}
|
}
|
||||||
@@ -339,7 +339,7 @@ void Vile()
|
|||||||
|
|
||||||
if (Vile_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"USanctMar")))
|
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);
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
|
||||||
SetLocalInt(oItem,"USanctMar",1);
|
SetLocalInt(oItem,"USanctMar",1);
|
||||||
int nAlign = GetGoodEvilValue(OBJECT_SELF);
|
int nAlign = GetGoodEvilValue(OBJECT_SELF);
|
||||||
@@ -352,7 +352,7 @@ void Vile()
|
|||||||
iType= GetBaseItemType(oItem);
|
iType= GetBaseItemType(oItem);
|
||||||
if(Vile_Feat_Wrapper(iType, oPC, oItem) && (!GetLocalInt(oItem,"USanctMar")))
|
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);
|
AddItemProperty(DURATION_TYPE_TEMPORARY,ItemPropertyVisualEffect(ITEM_VISUAL_EVIL),oItem,9999.0);
|
||||||
SetLocalInt(oItem,"USanctMar",1);
|
SetLocalInt(oItem,"USanctMar",1);
|
||||||
int nAlign = GetGoodEvilValue(OBJECT_SELF);
|
int nAlign = GetGoodEvilValue(OBJECT_SELF);
|
||||||
@@ -431,16 +431,16 @@ void main()
|
|||||||
|
|
||||||
if ( GetLocalInt(oItem,"SanctMar"))
|
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_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_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_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_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_HOLY,DURATION_TYPE_TEMPORARY);
|
||||||
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"SanctMar");
|
DeleteLocalInt(oItem,"SanctMar");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetLocalInt(oItem,"MartialStrik"))
|
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);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"MartialStrik");
|
DeleteLocalInt(oItem,"MartialStrik");
|
||||||
}
|
}
|
||||||
@@ -449,16 +449,16 @@ void main()
|
|||||||
|
|
||||||
if ( GetLocalInt(oItem,"SanctMar"))
|
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_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_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_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_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_HOLY,DURATION_TYPE_TEMPORARY);
|
||||||
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"SanctMar");
|
DeleteLocalInt(oItem,"SanctMar");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( GetLocalInt(oItem,"MartialStrik"))
|
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);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_HOLY,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"MartialStrik");
|
DeleteLocalInt(oItem,"MartialStrik");
|
||||||
}
|
}
|
||||||
@@ -504,7 +504,7 @@ void main()
|
|||||||
*/
|
*/
|
||||||
if (GetLocalInt(oItem,"UnholyStrik"))
|
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);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"UnholyStrik");
|
DeleteLocalInt(oItem,"UnholyStrik");
|
||||||
}
|
}
|
||||||
@@ -521,7 +521,7 @@ void main()
|
|||||||
*/
|
*/
|
||||||
if ( GetLocalInt(oItem,"UnholyStrik"))
|
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);
|
RemoveSpecificProperty(oItem,ITEM_PROPERTY_VISUALEFFECT,ITEM_VISUAL_EVIL,-1,1,"",-1,DURATION_TYPE_TEMPORARY);
|
||||||
DeleteLocalInt(oItem,"UnholyStrik");
|
DeleteLocalInt(oItem,"UnholyStrik");
|
||||||
}
|
}
|
||||||
@@ -544,8 +544,8 @@ void main()
|
|||||||
// Sanctify Strike
|
// Sanctify Strike
|
||||||
if (GetHasFeat(FEAT_SANCTIFYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_SANCTIFYKISTRIKE)))
|
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 eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1,DAMAGE_TYPE_HOLY),ALIGNMENT_ALL,ALIGNMENT_EVIL);
|
||||||
effect eEffect2 = VersusRacialTypeEffect(EffectDamageIncrease(DAMAGE_BONUS_1d4,DAMAGE_TYPE_POSITIVE),RACIAL_TYPE_OUTSIDER);
|
effect eEffect2 = VersusRacialTypeEffect(EffectDamageIncrease(DAMAGE_BONUS_1d4,DAMAGE_TYPE_HOLY),RACIAL_TYPE_OUTSIDER);
|
||||||
effect eLink = EffectLinkEffects(eEffect1,eEffect2);
|
effect eLink = EffectLinkEffects(eEffect1,eEffect2);
|
||||||
eLink = TagEffect(eLink,"SanctifyKiStrike");
|
eLink = TagEffect(eLink,"SanctifyKiStrike");
|
||||||
|
|
||||||
@@ -564,7 +564,7 @@ void main()
|
|||||||
// Holy Ki Strike
|
// Holy Ki Strike
|
||||||
if (GetHasFeat(FEAT_HOLYKISTRIKE, oPC) || GetLocalInt(oPC, "VoPFeat"+IntToString(FEAT_HOLYKISTRIKE)))
|
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");
|
eEffect1 = TagEffect(eEffect1,"HolyKiStrike");
|
||||||
|
|
||||||
//Remove any prior bonus to avoid duplication and remove Sanctify Ki Strike
|
//Remove any prior bonus to avoid duplication and remove Sanctify Ki Strike
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
#include "prc_feat_const"
|
#include "prc_feat_const"
|
||||||
#include "inc_item_props"
|
#include "inc_item_props"
|
||||||
|
#include "prc_x2_itemprop"
|
||||||
|
|
||||||
// * Applies the Acolyte's AC bonuses as CompositeBonuses on object's skin.
|
// * Applies the Acolyte's AC bonuses as CompositeBonuses on object's skin.
|
||||||
// * iLevel = integer AC Bonus
|
// * iLevel = integer AC Bonus
|
||||||
@@ -24,12 +25,9 @@ void AcolyteFiendSkin(object oPC, object oSkin, int iLevel)
|
|||||||
// * iLevel = IP_CONST_DAMAGEREDUCTION_*
|
// * iLevel = IP_CONST_DAMAGEREDUCTION_*
|
||||||
void AcolyteSymbiosis(object oPC, object oSkin, int iLevel)
|
void AcolyteSymbiosis(object oPC, object oSkin, int iLevel)
|
||||||
{
|
{
|
||||||
if(GetLocalInt(oSkin, "AcolyteSymbBonus") == iLevel) return;
|
itemproperty ipIP = ItemPropertyDamageReduction(iLevel, IP_CONST_DAMAGESOAK_20_HP);
|
||||||
|
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||||
|
|
||||||
//RemoveSpecificProperty(oSkin, ITEM_PROPERTY_DAMAGE_REDUCTION, GetLocalInt(oSkin, "AcolyteSymbBonus"), IP_CONST_DAMAGESOAK_20_HP, 1, "AcolyteSymbBonus");
|
|
||||||
RemoveSpecificProperty(oSkin, ITEM_PROPERTY_DAMAGE_REDUCTION, IP_CONST_DAMAGESOAK_20_HP, GetLocalInt(oSkin, "AcolyteSymbBonus"), 1, "AcolyteSymbBonus");
|
|
||||||
//AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDamageReduction(iLevel, IP_CONST_DAMAGESOAK_20_HP), oSkin);
|
|
||||||
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDamageReduction(IP_CONST_DAMAGESOAK_20_HP, iLevel), oSkin);
|
|
||||||
SetLocalInt(oSkin, "AcolyteSymbBonus", iLevel);
|
SetLocalInt(oSkin, "AcolyteSymbBonus", iLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -201,10 +201,33 @@ void main()
|
|||||||
{
|
{
|
||||||
oPC = GetItemLastEquippedBy();
|
oPC = GetItemLastEquippedBy();
|
||||||
oItem = GetItemLastEquipped();
|
oItem = GetItemLastEquipped();
|
||||||
|
|
||||||
|
string sTag = GetTag(oItem);
|
||||||
|
string sResRef = GetResRef(oItem);
|
||||||
|
|
||||||
|
int nRace = GetRacialType(oPC);
|
||||||
|
|
||||||
if(DEBUG) DoDebug("prc_forsaker - OnEquip\n"
|
if(DEBUG) DoDebug("prc_forsaker - OnEquip\n"
|
||||||
+ "oPC = " + DebugObject2Str(oPC) + "\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))
|
if(!GetHasFeat(FEAT_VOWOFPOVERTY,oPC))
|
||||||
{
|
{
|
||||||
// Check if item is a creature item - if so, skip magical item check
|
// Check if item is a creature item - if so, skip magical item check
|
||||||
|
|||||||
@@ -102,6 +102,18 @@ void main()
|
|||||||
DelayCommand(6.0, ExecuteScript("prc_onhb_indiv", oPC));
|
DelayCommand(6.0, ExecuteScript("prc_onhb_indiv", oPC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for Morality Undone expiration
|
||||||
|
if(GetPersistantLocalInt(oPC, "MoralityUndone_Expire") > 0)
|
||||||
|
{
|
||||||
|
if(GetTimeSecond() >= GetPersistantLocalInt(oPC, "MoralityUndone_Expire"))
|
||||||
|
{
|
||||||
|
int nShiftAmount = GetPersistantLocalInt(oPC, "MoralityUndone_ShiftAmount");
|
||||||
|
AdjustAlignment(oPC, ALIGNMENT_GOOD, nShiftAmount, FALSE);
|
||||||
|
DeletePersistantLocalInt(oPC, "MoralityUndone_Expire");
|
||||||
|
DeletePersistantLocalInt(oPC, "MoralityUndone_ShiftAmount");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* PC_damage code to support oni's scripts
|
/* PC_damage code to support oni's scripts
|
||||||
* If HP is over 1 apply the damage and let
|
* If HP is over 1 apply the damage and let
|
||||||
* the OnDying deal with the consequences
|
* the OnDying deal with the consequences
|
||||||
|
|||||||
@@ -98,5 +98,7 @@ void main()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SignalEvent(oPC, EventSpellCastAt(oTarget, PRCGetSpellId(), FALSE));
|
||||||
|
|
||||||
ForceNeedleAttack(oPC, oTarget, nBonus);
|
ForceNeedleAttack(oPC, oTarget, nBonus);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,19 @@
|
|||||||
#include "shd_inc_myst"
|
#include "shd_inc_myst"
|
||||||
#include "prc_inc_template"
|
#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)
|
void ResetLionSwiftness(object oPC)
|
||||||
{
|
{
|
||||||
int nLevel = GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC);
|
int nLevel = GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oPC);
|
||||||
@@ -345,6 +358,7 @@ void RestFinished(object oPC)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ResetLionSwiftness(oPC);
|
ResetLionSwiftness(oPC);
|
||||||
|
ClearAstarothCraftingFeat(oPC);
|
||||||
|
|
||||||
// Execute scripts hooked to this event for the player triggering it
|
// Execute scripts hooked to this event for the player triggering it
|
||||||
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERREST_FINISHED);
|
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERREST_FINISHED);
|
||||||
@@ -385,6 +399,30 @@ void RestStarted(object oPC)
|
|||||||
SetLocalInt(oPC, "DRUNKEN_MASTER_IS_IN_DRUNKEN_RAGE", 0);
|
SetLocalInt(oPC, "DRUNKEN_MASTER_IS_IN_DRUNKEN_RAGE", 0);
|
||||||
SetLocalInt(oPC, "DRUNKEN_MASTER_IS_DRUNK_LIKE_A_DEMON", 0);
|
SetLocalInt(oPC, "DRUNKEN_MASTER_IS_DRUNK_LIKE_A_DEMON", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clean up temporary Darkness item properties from inventory
|
||||||
|
object oItem = GetFirstItemInInventory(oPC);
|
||||||
|
while(GetIsObjectValid(oItem))
|
||||||
|
{
|
||||||
|
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DARKNESS);
|
||||||
|
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DAMNING_DARKNESS);
|
||||||
|
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DEEPER_DARKNESS);
|
||||||
|
oItem = GetNextItemInInventory(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also check equipped items
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < NUM_INVENTORY_SLOTS; i++)
|
||||||
|
{
|
||||||
|
oItem = GetItemInSlot(i, oPC);
|
||||||
|
if(GetIsObjectValid(oItem))
|
||||||
|
{
|
||||||
|
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DARKNESS);
|
||||||
|
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DAMNING_DARKNESS);
|
||||||
|
IPRemoveMatchingItemProperties(oItem, ITEM_PROPERTY_AREA_OF_EFFECT, DURATION_TYPE_TEMPORARY, IP_CONST_AOE_DEEPER_DARKNESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Left here in case the multisummon trick is ever broken. In that case, use this to make Astral Constructs get unsummoned properly
|
/* Left here in case the multisummon trick is ever broken. In that case, use this to make Astral Constructs get unsummoned properly
|
||||||
if(GetHasFeat(whatever feat determines if the PC can manifest Astral Construct here)){
|
if(GetHasFeat(whatever feat determines if the PC can manifest Astral Construct here)){
|
||||||
int i = 1;
|
int i = 1;
|
||||||
|
|||||||
@@ -1,4 +1,27 @@
|
|||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//::
|
||||||
|
//:: prc_shadolord.nss
|
||||||
|
//::
|
||||||
|
//:: Handles Shadow Sight & Shadow Blur
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//::
|
||||||
|
//:: Created by: Jaysyn
|
||||||
|
//:: Date: 2026-05-28 13:54:50
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//::
|
||||||
|
//:: Shadow Sight - Gains Darkvision and Ultravision in
|
||||||
|
//:: darkness.
|
||||||
|
//::
|
||||||
|
//:: Shadow Blur - In darkness gains the benefit of Blur
|
||||||
|
//;: spell (20% concealment at night or in
|
||||||
|
//:: a Darkness spell).
|
||||||
|
//::
|
||||||
|
//:: Shadow Discorporation - When reduced to 0 or fewer HP,
|
||||||
|
//:: (NOT IMPLEMENTED) has a chance to teleport away.
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
#include "prc_feat_const"
|
#include "prc_feat_const"
|
||||||
#include "prc_class_const"
|
#include "prc_class_const"
|
||||||
#include "prc_spell_const"
|
#include "prc_spell_const"
|
||||||
@@ -36,18 +59,50 @@ void Discorp(object oPC,int iEquip)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
|
||||||
//Declare main variables.
|
//:: Declare main variables.
|
||||||
object oPC = OBJECT_SELF;
|
object oPC = OBJECT_SELF;
|
||||||
object oSkin = GetPCSkin(oPC);
|
object oSkin = GetPCSkin(oPC);
|
||||||
|
object oArea = GetArea(oPC);
|
||||||
|
|
||||||
int bDiscor= GetHasFeat(FEAT_SHADOWDISCOPOR, oPC) ? 1 : 0;
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oPC);
|
||||||
|
int nNight = !GetIsDay();
|
||||||
|
int nTopside = GetIsAreaAboveGround(oArea);
|
||||||
|
int nOutside = !GetIsAreaInterior(oArea);
|
||||||
|
|
||||||
|
effect eLink;
|
||||||
|
effect eVis;
|
||||||
|
|
||||||
|
if (iShadow && nNight && nTopside && nOutside)
|
||||||
|
{
|
||||||
|
//:: Create visual feedback effect link
|
||||||
|
eVis = EffectVisualEffect(VFX_DUR_ULTRAVISION);
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectIcon(EFFECT_ICON_ULTRAVISION));
|
||||||
|
|
||||||
|
//:: Link Ultravision and visual feedback into base effect
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectUltravision());
|
||||||
|
eLink = EffectLinkEffects(eLink, eVis);
|
||||||
|
if(DEBUG) DoDebug("prc_shadowlord >> Setting up Ultravision");
|
||||||
|
|
||||||
|
if (iShadow > 1)
|
||||||
|
{
|
||||||
|
//;: Add concealment for level 2+ Shadowlords
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectConcealment(20));
|
||||||
|
if(DEBUG) DoDebug("prc_shadowlord >> Setting up Concealment");
|
||||||
|
}
|
||||||
|
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, 6.0f);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Shadow Discorporation was never finished
|
||||||
|
/* int bDiscor= GetHasFeat(FEAT_SHADOWDISCOPOR, oPC) ? 1 : 0;
|
||||||
|
|
||||||
if (GetLocalInt(oPC,"ONENTER")) return;
|
if (GetLocalInt(oPC,"ONENTER")) return;
|
||||||
if (bDiscor>0) Discorp(oPC,GetLocalInt(oPC,"ONEQUIP"));
|
if (bDiscor>0) Discorp(oPC,GetLocalInt(oPC,"ONEQUIP")); */
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "prc_inc_unarmed"
|
#include "prc_inc_unarmed"
|
||||||
|
#include "prc_inc_combat"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -98,12 +99,20 @@ void main()
|
|||||||
|
|
||||||
FloatingTextStringOnCreature("*Shou Disciple Abilities Disabled Due To Equipped Shield*", oPC);
|
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)
|
else if(StringToInt(Get2DACache("baseitems", "WeaponSize", iBaseL)) > 2 || StringToInt(Get2DACache("baseitems", "WeaponSize", iBaseR)) > 2)
|
||||||
{
|
{
|
||||||
PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_LIGHT);
|
PRCRemoveEffectsFromSpell(oPC, SPELL_MARTIAL_FLURRY_LIGHT);
|
||||||
FloatingTextStringOnCreature("*Martial Flurry Light Disabled Due to Equipped Weapons*", oPC);
|
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
|
else
|
||||||
{
|
{
|
||||||
if(GetLevelByClass(CLASS_TYPE_SHOU, oPC) > 1 )
|
if(GetLevelByClass(CLASS_TYPE_SHOU, oPC) > 1 )
|
||||||
@@ -113,6 +122,28 @@ void main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* // 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 )
|
||||||
|
{
|
||||||
|
RemoveDodge(oPC, oSkin);
|
||||||
|
DodgeBonus(oPC, oSkin);
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
//Evaluate The Unarmed Strike Feats
|
//Evaluate The Unarmed Strike Feats
|
||||||
//UnarmedFeats(oPC);
|
//UnarmedFeats(oPC);
|
||||||
SetLocalInt(OBJECT_SELF, CALL_UNARMED_FEATS, TRUE);
|
SetLocalInt(OBJECT_SELF, CALL_UNARMED_FEATS, TRUE);
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
//
|
||||||
|
// prc_sneak_att.nss
|
||||||
|
//
|
||||||
// Written by WodahsEht.
|
// Written by WodahsEht.
|
||||||
// Calculates the total sneak attack damage die given by all classes,
|
// Calculates the total sneak attack damage die given by all classes,
|
||||||
// and applies the resulting bonuses to the skin. KNOWN ISSUE:
|
// and applies the resulting bonuses to the skin. KNOWN ISSUE:
|
||||||
@@ -114,6 +117,13 @@ void main()
|
|||||||
int iRogueSneakDice = GetRogueSneak(oPC);
|
int iRogueSneakDice = GetRogueSneak(oPC);
|
||||||
int iBlackguardSneakDice = GetBlackguardSneak(oPC);
|
int iBlackguardSneakDice = GetBlackguardSneak(oPC);
|
||||||
|
|
||||||
|
// Daring Outlaw: Add half of Swashbuckler levels to Rogue sneak attack
|
||||||
|
if (GetHasFeat(FEAT_DARING_OUTLAW, oPC))
|
||||||
|
{
|
||||||
|
int nSwashbucklerLevel = GetLevelByClass(CLASS_TYPE_SWASHBUCKLER, oPC);
|
||||||
|
iRogueSneakDice += (nSwashbucklerLevel / 2);
|
||||||
|
}
|
||||||
|
|
||||||
// Special case in case someone multiclasses Telflammar Shadowlord and Assassin -- These are the only
|
// Special case in case someone multiclasses Telflammar Shadowlord and Assassin -- These are the only
|
||||||
// two classes that use Assassin Death Attack, and normally they would not stack.
|
// two classes that use Assassin Death Attack, and normally they would not stack.
|
||||||
if((GetLevelByClass(CLASS_TYPE_SHADOWLORD) >= 6) && (GetLevelByClass(CLASS_TYPE_ASSASSIN)))
|
if((GetLevelByClass(CLASS_TYPE_SHADOWLORD) >= 6) && (GetLevelByClass(CLASS_TYPE_ASSASSIN)))
|
||||||
|
|||||||
@@ -225,6 +225,10 @@ void DoWeaponUnequip(object oPC, object oItem)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear OTWF bonuses
|
||||||
|
SetCompositeAttackBonus(oPC, "OTWFL", 0, ATTACK_BONUS_OFFHAND);
|
||||||
|
SetCompositeAttackBonus(oPC, "OTWFR", 0, ATTACK_BONUS_ONHAND);
|
||||||
|
|
||||||
// if(DEBUG) DoDebug("prc_restwpnsize - OnUnEquip"); // <-script no longer exists
|
// if(DEBUG) DoDebug("prc_restwpnsize - OnUnEquip"); // <-script no longer exists
|
||||||
|
|
||||||
// remove any TWF penalties
|
// remove any TWF penalties
|
||||||
|
|||||||
@@ -225,10 +225,10 @@ void main()
|
|||||||
//:: Setup Holy Touch extra damage vs evil
|
//:: Setup Holy Touch extra damage vs evil
|
||||||
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||||
|
|
||||||
effect eEffect1 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_1d6, 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_DIVINE), 0, ALIGNMENT_EVIL);
|
effect eEffect2 = VersusAlignmentEffect(EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_HOLY), 0, ALIGNMENT_EVIL);
|
||||||
eEffect2 = VersusRacialTypeEffect(eEffect2, RACIAL_TYPE_OUTSIDER);
|
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);
|
eEffect3 = VersusRacialTypeEffect(eEffect3, RACIAL_TYPE_UNDEAD);
|
||||||
effect eLink = EffectLinkEffects(eEffect1, eEffect2);
|
effect eLink = EffectLinkEffects(eEffect1, eEffect2);
|
||||||
eLink = EffectLinkEffects(eLink, eEffect3);
|
eLink = EffectLinkEffects(eLink, eEffect3);
|
||||||
@@ -316,12 +316,12 @@ void main()
|
|||||||
if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_OUTSIDER ||
|
if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_OUTSIDER ||
|
||||||
MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
|
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);
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
eDam = EffectDamage(d6(1), DAMAGE_TYPE_DIVINE);
|
eDam = EffectDamage(d6(1), DAMAGE_TYPE_HOLY);
|
||||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
Modified: June 12, 2006
|
Modified: June 12, 2006
|
||||||
|
|
||||||
Flaming_Sword: Added touch attack roll
|
Flaming_Sword: Added touch attack roll
|
||||||
|
|
||||||
|
Fixed by: Jaysyn
|
||||||
|
Date: 2026-05-26 19:53:19
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "prc_sp_func"
|
#include "prc_sp_func"
|
||||||
@@ -56,15 +60,16 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
object oItemTarget = oTarget;
|
object oItemTarget = oTarget;
|
||||||
|
|
||||||
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
||||||
{ //touch attack roll if target creature is not an ally
|
{ //touch attack roll if target creature is not an ally
|
||||||
// ally = friendly or party member
|
|
||||||
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
||||||
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
||||||
|
|
||||||
if(iAttackRoll > 0)
|
if(iAttackRoll > 0)
|
||||||
{
|
{
|
||||||
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
||||||
|
if(DEBUG) DoDebug("Darkness: Chest item = " + DebugObject2Str(oItemTarget));
|
||||||
if(!GetIsObjectValid(oItemTarget))
|
if(!GetIsObjectValid(oItemTarget))
|
||||||
{
|
{
|
||||||
//no armor, check other slots
|
//no armor, check other slots
|
||||||
@@ -73,32 +78,52 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
|||||||
{
|
{
|
||||||
oItemTarget = GetItemInSlot(i, oTarget);
|
oItemTarget = GetItemInSlot(i, oTarget);
|
||||||
if(GetIsObjectValid(oItemTarget))
|
if(GetIsObjectValid(oItemTarget))
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("Darkness: Found item in slot " + IntToString(i));
|
||||||
break;//end for loop
|
break;//end for loop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply item property if valid item found
|
||||||
|
if(GetIsObjectValid(oItemTarget))
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||||
|
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel);
|
||||||
|
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||||
|
if(DEBUG) DoDebug("Darkness: IP applied");
|
||||||
|
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||||
|
}
|
||||||
|
// Otherwise fall through to location-based AOE
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Touch attack failed - do nothing
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
||||||
{
|
|
||||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, fDuration, TRUE, -1, nCasterLevel);
|
|
||||||
|
|
||||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
|
||||||
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
|
||||||
}
|
|
||||||
// If nothing is valid
|
|
||||||
else if (!GetIsObjectValid(oItemTarget) && !GetIsObjectValid(oItemTarget))
|
|
||||||
{
|
{
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||||
|
|
||||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
||||||
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||||
}
|
}
|
||||||
|
// Ground casting or creatures with no equipment - location-based AOE
|
||||||
|
else if(GetObjectType(oTarget) != OBJECT_TYPE_CREATURE || !GetIsObjectValid(oItemTarget))
|
||||||
|
{
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||||
|
|
||||||
|
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "VFX_PER_DARKNESS");
|
||||||
|
SetAllAoEInts(SPELL_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||||
|
}
|
||||||
|
// Valid item found on creature - apply item property
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//otherwise items get an IP
|
if(DEBUG) DoDebug("Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel);
|
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DARKNESS, nCasterLevel);
|
||||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||||
//this applies the effects relating to it
|
if(DEBUG) DoDebug("Darkness: IP applied");
|
||||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
||||||
|
|
||||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||||
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
||||||
@@ -39,13 +39,17 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
}
|
}
|
||||||
|
|
||||||
object oTarget = GetEnteringObject();
|
object oTarget = GetEnteringObject();
|
||||||
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD,oTarget);
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
if (iShadow)
|
if (iShadow)
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE);
|
{
|
||||||
if (iShadow>1)
|
ePnP = ShadowlordEffects(iShadow, ePnP);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE);
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink2 = ShadowlordEffects(iShadow, eLink2);
|
||||||
|
ePnP = TagEffect(ePnP, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink2 = TagEffect(eLink2, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
|
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
|
||||||
//Enter Metamagic conditions
|
//Enter Metamagic conditions
|
||||||
@@ -87,8 +91,9 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
else if (oTarget == GetAreaOfEffectCreator())
|
else if (oTarget == GetAreaOfEffectCreator())
|
||||||
{
|
{
|
||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));
|
||||||
//Fire cast spell at event for the specified target
|
if (iShadow)
|
||||||
if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||||
|
else if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
||||||
else
|
else
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||||
@@ -100,6 +105,3 @@ DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|||||||
// Getting rid of the local integer storing the spellschool name
|
// Getting rid of the local integer storing the spellschool name
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,12 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
effect eEffect = GetFirstEffect(oTarget);
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
while(GetIsEffectValid(eEffect))
|
while(GetIsEffectValid(eEffect))
|
||||||
{
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
if(GetEffectTag(eEffect) == "PNP_DARKNESS")
|
if(GetEffectTag(eEffect) == "PNP_DARKNESS")
|
||||||
RemoveEffect(oTarget, eEffect);
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
|
||||||
@@ -71,6 +77,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
eEffect = GetNextEffect(oTarget);
|
eEffect = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||||
// Getting rid of the local integer storing the spellschool name
|
// Getting rid of the local integer storing the spellschool name
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
|
|||||||
}
|
}
|
||||||
//nDamage += ApplySpellBetrayalStrikeDamage(oTarget, OBJECT_SELF, FALSE);
|
//nDamage += ApplySpellBetrayalStrikeDamage(oTarget, OBJECT_SELF, FALSE);
|
||||||
//Set the damage effect
|
//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.
|
// Apply effects to the currently selected target.
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
|
||||||
PRCBonusDamage(oTarget);
|
PRCBonusDamage(oTarget);
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
|
|
||||||
//Apply the MIRV and damage effect
|
//Apply the MIRV and damage effect
|
||||||
nDam += SpellDamagePerDice(OBJECT_SELF, 1);
|
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_INSTANT, eDam, oTarget));
|
||||||
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget,0.0f,FALSE));
|
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget,0.0f,FALSE));
|
||||||
DelayCommand(fDelay2, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget));
|
DelayCommand(fDelay2, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget));
|
||||||
|
|||||||
@@ -1,3 +1,26 @@
|
|||||||
|
//::///////////////////////////////////////////////
|
||||||
|
//:: Blacklight
|
||||||
|
//:: sp_blacklight.nss
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
You create an area of total darkness.
|
||||||
|
|
||||||
|
The darkness is impenetrable to normal vision
|
||||||
|
and darkvision, but you can see normally within
|
||||||
|
the blacklit area. Creatures outside the
|
||||||
|
spell's area, even you, cannot see through it.
|
||||||
|
You can cast the spell on a point in space, but
|
||||||
|
the effect is stationary unless you cast it cast
|
||||||
|
on a mobile object. You can cast the spell on a
|
||||||
|
creature, and the effect then radiates from the
|
||||||
|
creature and moves as it moves. Unattended
|
||||||
|
objects and points in space do not get saving
|
||||||
|
throws or benefit from spell resistance.
|
||||||
|
|
||||||
|
Blacklight counters or dispels any light spell
|
||||||
|
of equal or lower level, such as daylight.
|
||||||
|
*/
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
@@ -46,5 +69,4 @@ void main()
|
|||||||
SetAllAoEInts(SPELL_BLACKLIGHT, oAoE, PRCGetSpellSaveDC(SPELL_BLACKLIGHT, SPELL_SCHOOL_EVOCATION), 0, nCastLvl);
|
SetAllAoEInts(SPELL_BLACKLIGHT, oAoE, PRCGetSpellSaveDC(SPELL_BLACKLIGHT, SPELL_SCHOOL_EVOCATION), 0, nCastLvl);
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,28 @@
|
|||||||
//::///////////////////////////////////////////////
|
//::///////////////////////////////////////////////
|
||||||
//:: Darkness: On Enter
|
//:: Blacklight: On Enter
|
||||||
//:: NW_S0_DarknessA.nss
|
//:: sp_blacklighta.nss
|
||||||
//:: Copyright (c) 2001 Bioware Corp.
|
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
/*
|
/*
|
||||||
Creates a globe of darkness around those in the area
|
You create an area of total darkness.
|
||||||
of effect.
|
|
||||||
|
The darkness is impenetrable to normal vision
|
||||||
|
and darkvision, but you can see normally within
|
||||||
|
the blacklit area. Creatures outside the
|
||||||
|
spell's area, even you, cannot see through it.
|
||||||
|
You can cast the spell on a point in space, but
|
||||||
|
the effect is stationary unless you cast it cast
|
||||||
|
on a mobile object. You can cast the spell on a
|
||||||
|
creature, and the effect then radiates from the
|
||||||
|
creature and moves as it moves. Unattended
|
||||||
|
objects and points in space do not get saving
|
||||||
|
throws or benefit from spell resistance.
|
||||||
|
|
||||||
|
Blacklight counters or dispels any light spell
|
||||||
|
of equal or lower level, such as daylight.
|
||||||
*/
|
*/
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:: Created By: Preston Watamaniuk
|
//:: Created By: Jaysyn
|
||||||
//:: Created On: Feb 28, 2002
|
//:: Created On: 2026-05-28 12:07:02
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
@@ -22,45 +35,45 @@ void main()
|
|||||||
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
||||||
effect eInvis2 = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
|
effect eInvis2 = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
|
||||||
effect eDarkv = EffectUltravision();
|
effect eDarkv = EffectUltravision();
|
||||||
effect eCounc=EffectConcealment(50);
|
effect eCounc = EffectConcealment(20);
|
||||||
effect eDark = EffectDarkness();
|
effect eDark = EffectDarkness();
|
||||||
effect eBlind= EffectBlindness();
|
effect eBlind = EffectBlindness();
|
||||||
|
|
||||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||||
effect eLink = EffectLinkEffects(eDark, eDur);
|
effect eLink = EffectLinkEffects(eDark, eDur);
|
||||||
eLink = EffectLinkEffects(eLink, eBlind);
|
eLink = EffectLinkEffects(eLink, eBlind);
|
||||||
effect eLink2 = EffectLinkEffects(eInvis, eDur);
|
effect eLink2 = EffectLinkEffects(eInvis, eDur);
|
||||||
|
|
||||||
eLink2=EffectLinkEffects(eInvis2,eDur);
|
eLink2 = EffectLinkEffects(eInvis2,eDur);
|
||||||
eLink2=EffectLinkEffects(eDarkv, eLink2);
|
eLink2 = EffectLinkEffects(eDarkv, eLink2);
|
||||||
eLink2=EffectLinkEffects(eLink2,eCounc);
|
eLink2 = EffectLinkEffects(eLink2,eCounc);
|
||||||
|
|
||||||
object oTarget = GetEnteringObject();
|
object oTarget = GetEnteringObject();
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD,oTarget);
|
|
||||||
|
|
||||||
if (iShadow)
|
if (iShadow)
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE);
|
{
|
||||||
if (iShadow>1)
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE);
|
eLink2 = ShadowlordEffects(iShadow, eLink2);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink2 = TagEffect(eLink2, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
if(GetIsObjectValid(oTarget) && oTarget != GetAreaOfEffectCreator())
|
if(GetIsObjectValid(oTarget) && oTarget != GetAreaOfEffectCreator())
|
||||||
{
|
{
|
||||||
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
|
||||||
{
|
{
|
||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DARKNESS));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_BLACKLIGHT));
|
||||||
//Make SR Check
|
//Make SR Check
|
||||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,SPGetPenetrAOE(GetAreaOfEffectCreator())))
|
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,SPGetPenetrAOE(GetAreaOfEffectCreator())))
|
||||||
{
|
{
|
||||||
if (!iShadow)
|
|
||||||
//Fire cast spell at event for the specified target
|
//Fire cast spell at event for the specified target
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DARKNESS, FALSE));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_BLACKLIGHT, FALSE));
|
||||||
if (!iShadow)
|
|
||||||
//Fire cast spell at event for the specified target
|
//Fire cast spell at event for the specified target
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ void main()
|
|||||||
{
|
{
|
||||||
int nID = GetEffectSpellId(eAOE);
|
int nID = GetEffectSpellId(eAOE);
|
||||||
|
|
||||||
if( nID== SPELL_UR_BLACKLIGHT)
|
if( nID== SPELL_BLACKLIGHT)
|
||||||
{
|
{
|
||||||
if (GetEffectCreator(eAOE) == oCreator)
|
if (GetEffectCreator(eAOE) == oCreator)
|
||||||
RemoveEffect(oTarget, eAOE);
|
RemoveEffect(oTarget, eAOE);
|
||||||
@@ -27,6 +27,17 @@ void main()
|
|||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
|
|||||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget, 3.0);
|
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, eDam, oTarget);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DESTRUCTION), oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DESTRUCTION), oTarget);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,19 @@ void main()
|
|||||||
|
|
||||||
|
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, PRCGetSpellTargetLocation());
|
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
|
//Set up for loop
|
||||||
int i = nCasterLevel;
|
int i = nCasterLevel;
|
||||||
@@ -61,7 +73,7 @@ void main()
|
|||||||
DispelLoop(oTarget, nCasterLevel);
|
DispelLoop(oTarget, nCasterLevel);
|
||||||
i--;
|
i--;
|
||||||
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE,lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT | OBJECT_TYPE_PLACEABLE);
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE,lLocal, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_AREA_OF_EFFECT | OBJECT_TYPE_PLACEABLE);
|
||||||
}
|
} */
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,16 @@ void main()
|
|||||||
fDuration = fDuration *2; //Duration is +100%
|
fDuration = fDuration *2; //Duration is +100%
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLinkConf = TagEffect(eLinkConf, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
// * July 2003: If has darkness then do not put it on it again
|
// * July 2003: If has darkness then do not put it on it again
|
||||||
// Primogenitor: Yes, what about overlapping darkness effects by different casters?
|
// Primogenitor: Yes, what about overlapping darkness effects by different casters?
|
||||||
//if (PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oTarget) == TRUE)
|
//if (PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oTarget) == TRUE)
|
||||||
|
|||||||
@@ -40,6 +40,16 @@ void main()
|
|||||||
//Get next effect on the target
|
//Get next effect on the target
|
||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ Halt - The target stands in place and takes no action for one round.
|
|||||||
|
|
||||||
Author: Stratovarius
|
Author: Stratovarius
|
||||||
Created: 29/4/06
|
Created: 29/4/06
|
||||||
|
|
||||||
|
Fixed by: Jaysyn
|
||||||
|
Date: 2026-05-29 00:57:05
|
||||||
*/
|
*/
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
@@ -60,6 +63,8 @@ void main()
|
|||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
|
||||||
|
|
||||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget, nCaster+SPGetPenetr()) && PRCGetIsAliveCreature(oTarget))
|
if (!PRCDoResistSpell(OBJECT_SELF, oTarget, nCaster+SPGetPenetr()) && PRCGetIsAliveCreature(oTarget))
|
||||||
|
{
|
||||||
|
if(!GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS))
|
||||||
{
|
{
|
||||||
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS))
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS))
|
||||||
{
|
{
|
||||||
@@ -68,6 +73,7 @@ void main()
|
|||||||
DoCommandSpell(oCaster, oTarget, nSpellId, nDuration, nCaster);
|
DoCommandSpell(oCaster, oTarget, nSpellId, nDuration, nCaster);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ tiny needle hidden inside it.
|
|||||||
|
|
||||||
Author: Tenjac
|
Author: Tenjac
|
||||||
Created:
|
Created:
|
||||||
|
|
||||||
|
Fixed by: Jaysyn
|
||||||
|
Date: 2026-05-26 19:53:19
|
||||||
|
|
||||||
*/
|
*/
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
@@ -63,8 +67,15 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
|||||||
if(nMetaMagic & METAMAGIC_EXTEND)
|
if(nMetaMagic & METAMAGIC_EXTEND)
|
||||||
fDuration *= 2;
|
fDuration *= 2;
|
||||||
|
|
||||||
|
int nShadow = PRCMax(GetLocalInt(oCaster, "ShadowMantle_Shoulder"), GetLocalInt(oTarget, "ShadowMantle_Shoulder"));
|
||||||
|
if (nShadow) nPnP = FALSE;
|
||||||
|
if (DEBUG) DoDebug("sp_damng_dark: oCaster "+GetName(oCaster)+" oTarget "+GetName(oTarget)+" nSwitch "+IntToString(nPnP));
|
||||||
|
|
||||||
if(!nPnP)
|
if(!nPnP)
|
||||||
{
|
{
|
||||||
|
if (nShadow)
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oCaster, fDuration);
|
||||||
|
else
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||||
|
|
||||||
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||||
@@ -73,15 +84,16 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
object oItemTarget = oTarget;
|
object oItemTarget = oTarget;
|
||||||
|
|
||||||
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
||||||
{ //touch attack roll if target creature is not an ally
|
{ //touch attack roll if target creature is not an ally
|
||||||
// ally = friendly or party member
|
|
||||||
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
if(!spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
|
||||||
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
|
||||||
|
|
||||||
if(iAttackRoll > 0)
|
if(iAttackRoll > 0)
|
||||||
{
|
{
|
||||||
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
oItemTarget = GetItemInSlot(INVENTORY_SLOT_CHEST, oTarget);
|
||||||
|
if(DEBUG) DoDebug("Damning Darkness: Chest item = " + DebugObject2Str(oItemTarget));
|
||||||
if(!GetIsObjectValid(oItemTarget))
|
if(!GetIsObjectValid(oItemTarget))
|
||||||
{
|
{
|
||||||
//no armor, check other slots
|
//no armor, check other slots
|
||||||
@@ -90,33 +102,52 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
|||||||
{
|
{
|
||||||
oItemTarget = GetItemInSlot(i, oTarget);
|
oItemTarget = GetItemInSlot(i, oTarget);
|
||||||
if(GetIsObjectValid(oItemTarget))
|
if(GetIsObjectValid(oItemTarget))
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("Damning Darkness: Found item in slot " + IntToString(i));
|
||||||
break;//end for loop
|
break;//end for loop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE || !GetIsObjectValid(oItemTarget))
|
// Apply item property if valid item found
|
||||||
|
if(GetIsObjectValid(oItemTarget))
|
||||||
{
|
{
|
||||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oTarget, fDuration, TRUE, -1, nCasterLevel);
|
if(DEBUG) DoDebug("Damning Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||||
|
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DAMNING_DARKNESS, nCasterLevel);
|
||||||
object oAoE = GetAreaOfEffectObject(GetLocation(oTarget), "AOE_PER_DAMNDARK");
|
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
if(DEBUG) DoDebug("Damning Darkness: IP applied");
|
||||||
|
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||||
}
|
}
|
||||||
// If nothing is valid
|
// Otherwise fall through to location-based AOE
|
||||||
else if (!GetIsObjectValid(oItemTarget) && !GetIsObjectValid(oItemTarget))
|
|
||||||
{
|
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
|
||||||
|
|
||||||
object oAoE = GetAreaOfEffectObject(GetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
|
||||||
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//otherwise items get an IP
|
// Touch attack failed - do nothing
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
||||||
|
{
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||||
|
|
||||||
|
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||||
|
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||||
|
}
|
||||||
|
// Ground casting or creatures with no equipment - location-based AOE
|
||||||
|
else if(GetObjectType(oTarget) != OBJECT_TYPE_CREATURE || !GetIsObjectValid(oItemTarget))
|
||||||
|
{
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, PRCGetSpellTargetLocation(), fDuration);
|
||||||
|
|
||||||
|
object oAoE = GetAreaOfEffectObject(PRCGetSpellTargetLocation(), "AOE_PER_DAMNDARK");
|
||||||
|
SetAllAoEInts(SPELL_DAMNING_DARKNESS, oAoE, PRCGetSpellSaveDC(SPELL_DAMNING_DARKNESS, SPELL_SCHOOL_EVOCATION), 0, nCasterLevel);
|
||||||
|
}
|
||||||
|
// Valid item found on creature - apply item property
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("Damning Darkness: Applying IP to " + DebugObject2Str(oItemTarget));
|
||||||
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DAMNING_DARKNESS, nCasterLevel);
|
itemproperty ipDarkness = ItemPropertyAreaOfEffect(IP_CONST_AOE_DAMNING_DARKNESS, nCasterLevel);
|
||||||
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
IPSafeAddItemProperty(oItemTarget, ipDarkness, fDuration);
|
||||||
//this applies the effects relating to it
|
if(DEBUG) DoDebug("Damning Darkness: IP applied");
|
||||||
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
DelayCommand(0.1, VoidCheckPRCLimitations(oItemTarget, OBJECT_INVALID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//::///////////////////////////////////////////////
|
//::///////////////////////////////////////////////
|
||||||
//:: Name Damning Darkness
|
//:: Name Damning Darkness
|
||||||
//:: FileName sp_damng_dark.nss
|
//:: FileName sp_damng_darka.nss
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
/**@file Damning Darkness
|
/**@file Damning Darkness
|
||||||
Evocation [Darkness, Evil]
|
Evocation [Darkness, Evil]
|
||||||
@@ -31,55 +31,122 @@ tiny needle hidden inside it.
|
|||||||
|
|
||||||
Author: Tenjac
|
Author: Tenjac
|
||||||
Created: 6/12/06
|
Created: 6/12/06
|
||||||
|
|
||||||
|
Fixed by: Jaysyn
|
||||||
|
Date: 2026-05-26 19:53:19
|
||||||
*/
|
*/
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
void DarkLoop(object oTarget, object oPC);
|
|
||||||
|
|
||||||
|
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
|
|
||||||
|
void DarkLoop(object oTarget, object oPC, int nMetaMagic);
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||||
|
|
||||||
object oTarget = GetEnteringObject();
|
|
||||||
object oPC = GetAreaOfEffectCreator();
|
|
||||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
||||||
effect eDark = EffectDarkness();
|
effect eDark = EffectDarkness();
|
||||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||||
effect eLink = EffectLinkEffects(eDark, eDur);
|
|
||||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, (600.0f * nCasterLvl));
|
|
||||||
|
|
||||||
DarkLoop(oTarget, oPC);
|
effect eLink = EffectLinkEffects(eDark, eDur);
|
||||||
|
eLink = TagEffect(eLink, "BIO_DARKNESS");
|
||||||
|
|
||||||
|
effect eLink2 = EffectLinkEffects(eInvis, eDur);
|
||||||
|
eLink2 = TagEffect(eLink2, "PNP_DARKNESS");
|
||||||
|
|
||||||
|
effect ePnP = EffectLinkEffects(eDur, EffectDarkness());
|
||||||
|
if(GetPRCSwitch(PRC_PNP_DARKNESS_35ED))
|
||||||
|
{
|
||||||
|
ePnP = EffectLinkEffects(eDur, EffectConcealment(20));
|
||||||
|
ePnP = TagEffect(ePnP, "PNP35_DARKNESS");
|
||||||
|
}
|
||||||
|
|
||||||
|
object oPC = GetAreaOfEffectCreator();
|
||||||
|
|
||||||
|
object oTarget = GetEnteringObject();
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
ePnP = ShadowlordEffects(iShadow, ePnP);
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink2 = ShadowlordEffects(iShadow, eLink2);
|
||||||
|
ePnP = TagEffect(ePnP, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink2 = TagEffect(eLink2, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
|
int nDuration = PRCGetCasterLevel(oPC);
|
||||||
|
if ((nMetaMagic & METAMAGIC_EXTEND))
|
||||||
|
{
|
||||||
|
nDuration = nDuration *2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GetIsObjectValid(oTarget) && oTarget != oPC)
|
||||||
|
{
|
||||||
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oPC))
|
||||||
|
{
|
||||||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DAMNING_DARKNESS));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DAMNING_DARKNESS, FALSE));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
||||||
|
else
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget,0.0f,FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (oTarget == oPC)
|
||||||
|
{
|
||||||
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DAMNING_DARKNESS, FALSE));
|
||||||
|
if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
||||||
|
else
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set local variable to mark target as in AOE for damage tracking
|
||||||
|
SetLocalInt(oTarget, "PRC_DamningDarkness_InAOE", TRUE);
|
||||||
|
|
||||||
|
// Start damage loop
|
||||||
|
DarkLoop(oTarget, oPC, nMetaMagic);
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DarkLoop(object oTarget, object oPC)
|
void DarkLoop(object oTarget, object oPC, int nMetaMagic)
|
||||||
{
|
{
|
||||||
if(GetIsObjectValid(oTarget))
|
// Check if target is still marked as being in the AOE
|
||||||
|
if(GetIsObjectValid(oTarget) && GetLocalInt(oTarget, "PRC_DamningDarkness_InAOE"))
|
||||||
{
|
{
|
||||||
if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD)
|
if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD)
|
||||||
{
|
{
|
||||||
int nDam = SpellDamagePerDice(oPC, 2) + d6(2);
|
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)
|
else if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_NEUTRAL)
|
||||||
{
|
{
|
||||||
int nDam = SpellDamagePerDice(oPC, 2) + d6(2);
|
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
|
else
|
||||||
{
|
{
|
||||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), oTarget, 1.0f);
|
// Evil creatures take no damage
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
DelayCommand(6.0f, DarkLoop(oTarget, oPC));
|
DelayCommand(6.0f, DarkLoop(oTarget, oPC, nMetaMagic));
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -31,10 +31,13 @@ tiny needle hidden inside it.
|
|||||||
|
|
||||||
Author: Tenjac
|
Author: Tenjac
|
||||||
Created:
|
Created:
|
||||||
|
|
||||||
|
Fixed by: Jaysyn
|
||||||
|
Date: 2026-05-26 19:53:19
|
||||||
|
|
||||||
*/
|
*/
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
|
|
||||||
@@ -42,21 +45,24 @@ void main()
|
|||||||
{
|
{
|
||||||
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
||||||
|
|
||||||
//Declare major variables
|
|
||||||
//Get the object that is exiting the AOE
|
|
||||||
object oTarget = GetExitingObject();
|
object oTarget = GetExitingObject();
|
||||||
|
object oPC = GetAreaOfEffectCreator();
|
||||||
effect eAOE;
|
effect eAOE;
|
||||||
|
|
||||||
|
// Clear the in-AOE marker to stop damage tracking
|
||||||
|
DeleteLocalInt(oTarget, "PRC_DamningDarkness_InAOE");
|
||||||
|
|
||||||
if(GetHasSpellEffect(SPELL_DAMNING_DARKNESS, oTarget))
|
if(GetHasSpellEffect(SPELL_DAMNING_DARKNESS, oTarget))
|
||||||
{
|
{
|
||||||
//Search through the valid effects on the target.
|
//Search through the valid effects on the target.
|
||||||
eAOE = GetFirstEffect(oTarget);
|
eAOE = GetFirstEffect(oTarget);
|
||||||
while (GetIsEffectValid(eAOE))
|
while (GetIsEffectValid(eAOE))
|
||||||
{
|
{
|
||||||
if (GetEffectCreator(eAOE) == GetAreaOfEffectCreator())
|
if (GetEffectCreator(eAOE) == oPC)
|
||||||
{
|
{
|
||||||
if(GetEffectType(eAOE) == EFFECT_TYPE_DARKNESS)
|
if(GetEffectType(eAOE) == EFFECT_TYPE_DARKNESS)
|
||||||
{
|
{
|
||||||
//If the effect was created by CotA then remove it
|
//If the effect was created by Damning Darkness then remove it
|
||||||
if(GetEffectSpellId(eAOE) == SPELL_DAMNING_DARKNESS)
|
if(GetEffectSpellId(eAOE) == SPELL_DAMNING_DARKNESS)
|
||||||
{
|
{
|
||||||
RemoveEffect(oTarget, eAOE);
|
RemoveEffect(oTarget, eAOE);
|
||||||
@@ -67,5 +73,17 @@ void main()
|
|||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_damng_darkb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ void main()
|
|||||||
int nDice = nCasterLevel > 10 ? 10 : nCasterLevel;
|
int nDice = nCasterLevel > 10 ? 10 : nCasterLevel;
|
||||||
|
|
||||||
DoBolt (nCasterLevel,4, 0, nDice, VFX_BEAM_MIND, VFX_IMP_MAGBLUE,
|
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());
|
SPELL_SCHOOL_EVOCATION, TRUE, GetSpellId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ void SendMissileBomb(object oCaster, object oTarget, float fDelay=0.0, float fTi
|
|||||||
if (nMetaMagic == METAMAGIC_EMPOWER)
|
if (nMetaMagic == METAMAGIC_EMPOWER)
|
||||||
nDam += nDam/2;
|
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));
|
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_MAGBLUE, FALSE, 4.0f), oLoop));
|
||||||
}
|
}
|
||||||
else if (!PRCDoResistSpell(oCaster, oLoop, nPenetr, fDelay))
|
else if (!PRCDoResistSpell(oCaster, oLoop, nPenetr, fDelay))
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ void main()
|
|||||||
PRCSignalSpellEvent(oTarget, TRUE, nSpellId);
|
PRCSignalSpellEvent(oTarget, TRUE, nSpellId);
|
||||||
|
|
||||||
//Roll damage for each target
|
//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);
|
nDamage += SpellDamagePerDice(oCaster, nDice);
|
||||||
// Succeeded on the save
|
// Succeeded on the save
|
||||||
if (PRCMySavingThrow(SAVING_THROW_FORT, oTarget, PRCGetSaveDC(oTarget, oCaster)))
|
if (PRCMySavingThrow(SAVING_THROW_FORT, oTarget, PRCGetSaveDC(oTarget, oCaster)))
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
fTime += fDelay2;
|
fTime += fDelay2;
|
||||||
|
|
||||||
//Set damage effect
|
//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
|
//Apply the MIRV and damage effect
|
||||||
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
|
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,17 @@ void main()
|
|||||||
//Spell Resist
|
//Spell Resist
|
||||||
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
|
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
|
||||||
{
|
{
|
||||||
//Saving Throw
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_EVIL))
|
||||||
|
{
|
||||||
|
//Poor, poor paladin. It's pathetic that you didn't make your save.
|
||||||
|
AdjustAlignment(oTarget, ALIGNMENT_EVIL, (100 + nGoodEvil), FALSE);
|
||||||
|
|
||||||
|
// Store expiration time and shift amount using persistent locals
|
||||||
|
SetPersistantLocalInt(oTarget, "MoralityUndone_Expire", FloatToInt(GetTimeSecond() + fDur));
|
||||||
|
SetPersistantLocalInt(oTarget, "MoralityUndone_ShiftAmount", (100 + nGoodEvil));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* //Saving Throw
|
||||||
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_EVIL))
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_EVIL))
|
||||||
{
|
{
|
||||||
//Poor, poor paladin. It's pathetic that you didn't make your save.
|
//Poor, poor paladin. It's pathetic that you didn't make your save.
|
||||||
@@ -74,7 +84,7 @@ void main()
|
|||||||
//Schedule restoration. This might be a problem if they were 100 before and
|
//Schedule restoration. This might be a problem if they were 100 before and
|
||||||
//improved their alignment any while evil. They might be restored to 85 instead.
|
//improved their alignment any while evil. They might be restored to 85 instead.
|
||||||
DelayCommand(fDur, AdjustAlignment(oTarget, ALIGNMENT_GOOD, (100 + nGoodEvil), FALSE));
|
DelayCommand(fDur, AdjustAlignment(oTarget, ALIGNMENT_GOOD, (100 + nGoodEvil), FALSE));
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
//SPEvilShift(oPC);
|
//SPEvilShift(oPC);
|
||||||
|
|||||||
@@ -85,8 +85,7 @@ void main()
|
|||||||
int nVile = nDam/2;
|
int nVile = nDam/2;
|
||||||
int nNorm = (nDam - nVile);
|
int nNorm = (nDam - nVile);
|
||||||
|
|
||||||
//Vile damage is currently being applied as Positive damage
|
effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_VILE);
|
||||||
effect eVileDam = PRCEffectDamage(oTarget, nVile, DAMAGE_TYPE_POSITIVE);
|
|
||||||
effect eNormDam = PRCEffectDamage(oTarget, nNorm, DAMAGE_TYPE_MAGICAL);
|
effect eNormDam = PRCEffectDamage(oTarget, nNorm, DAMAGE_TYPE_MAGICAL);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
|
||||||
|
|||||||
@@ -96,8 +96,8 @@ void main()
|
|||||||
nDam += SpellDamagePerDice(oPC, nLevel);
|
nDam += SpellDamagePerDice(oPC, nLevel);
|
||||||
int nVile = nDam/2;
|
int nVile = nDam/2;
|
||||||
int nNorm = (nDam - nVile);
|
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);
|
effect eNormDam = PRCEffectDamage(oTarget, nNorm, DAMAGE_TYPE_MAGICAL);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
#include "prc_inc_switch"
|
#include "prc_inc_switch"
|
||||||
#include "inc_utility"
|
#include "inc_utility"
|
||||||
#include "prc_add_spell_dc"
|
#include "prc_add_spell_dc"
|
||||||
|
#include "prc_misc_const"
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
@@ -110,8 +111,8 @@ void main()
|
|||||||
nDam += SpellDamagePerDice(oPC, nLevel);
|
nDam += SpellDamagePerDice(oPC, nLevel);
|
||||||
int nVile = nDam/2;
|
int nVile = nDam/2;
|
||||||
int nNorm = (nDam - nVile);
|
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);
|
effect eNormDam = PRCEffectDamage(oTarget, nNorm, DAMAGE_TYPE_MAGICAL);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVileDam, oTarget);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eNormDam, oTarget);
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ void main()
|
|||||||
if(nTouch)
|
if(nTouch)
|
||||||
{
|
{
|
||||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_PULSE_BOMB), oTarget);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,8 +43,21 @@ void main()
|
|||||||
|
|
||||||
effect eLink = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
effect eLink = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
||||||
eLink = EffectLinkEffects(eLink, EffectUltravision());
|
eLink = EffectLinkEffects(eLink, EffectUltravision());
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_ULTRAVISION));
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT));
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectIcon(EFFECT_ICON_ULTRAVISION));
|
||||||
effect eDark = EffectDarkness();
|
effect eDark = EffectDarkness();
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eDark = ShadowlordEffects(iShadow, eDark);
|
||||||
|
eDark = TagEffect(eDark, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
//if valid and not caster
|
//if valid and not caster
|
||||||
if(GetIsObjectValid(oTarget) && oTarget != oPC)
|
if(GetIsObjectValid(oTarget) && oTarget != oPC)
|
||||||
@@ -53,7 +66,18 @@ void main()
|
|||||||
{
|
{
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDark, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDark, oTarget);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (oTarget == oPC)
|
||||||
|
{
|
||||||
|
// Caster gets effects based on alignment
|
||||||
|
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL)
|
||||||
|
{
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDark, oTarget);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
|
|||||||
@@ -54,6 +54,12 @@ void main()
|
|||||||
RemoveEffect(oTarget, eAOE);
|
RemoveEffect(oTarget, eAOE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(GetEffectTag(eAOE) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eAOE);
|
||||||
|
if(DEBUG) DoDebug("sp_utterdarkb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
//Get next effect on the target
|
//Get next effect on the target
|
||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//::///////////////////////////////////////////////
|
//::///////////////////////////////////////////////
|
||||||
//:: Shelgarn's Persistent Blade
|
//:: Shelgarn's Persistent Blade
|
||||||
//:: X2_S0_PersBlde
|
//:: x2_s0_persblde
|
||||||
//:: Copyright (c) 2001 Bioware Corp.
|
//:: Copyright (c) 2001 Bioware Corp.
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
/*
|
/*
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
//:: Last Updated By: Georg Zoeller, Aug 2003
|
//:: Last Updated By: Georg Zoeller, Aug 2003
|
||||||
//:: altered by mr_bumpkin Dec 4, 2003 for prc stuff
|
//:: altered by mr_bumpkin Dec 4, 2003 for prc stuff
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
|
#include "inc_spirit_weapn"
|
||||||
|
|
||||||
//Creates the weapon that the creature will be using.
|
//Creates the weapon that the creature will be using.
|
||||||
void spellsCreateItemForSummoned(object oCaster, float fDuration, int nClass)
|
void spellsCreateItemForSummoned(object oCaster, float fDuration, int nClass)
|
||||||
@@ -29,7 +30,8 @@ void spellsCreateItemForSummoned(object oCaster, float fDuration, int nClass)
|
|||||||
nStat = 1;
|
nStat = 1;
|
||||||
|
|
||||||
object oWeapon;
|
object oWeapon;
|
||||||
string sWeapon = "NW_WSWDG001";
|
//string sWeapon = "NW_WSWDG001";
|
||||||
|
string sWeapon = "PRC_PERBLADE01";
|
||||||
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster);
|
object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster);
|
||||||
int i = 1;
|
int i = 1;
|
||||||
while(GetIsObjectValid(oSummon))
|
while(GetIsObjectValid(oSummon))
|
||||||
@@ -54,7 +56,118 @@ void spellsCreateItemForSummoned(object oCaster, float fDuration, int nClass)
|
|||||||
|
|
||||||
void main()
|
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);
|
PRCSetSchool(SPELL_SCHOOL_CONJURATION);
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -5393,6 +5393,24 @@ Base Critical Threat: x2
|
|||||||
Base Damage Type: Piercing
|
Base Damage Type: Piercing
|
||||||
Weapon Size: Small
|
Weapon Size: Small
|
||||||
Feats Required: Simple</entry>
|
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"><CUSTOM0> 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"><CUSTOM0> 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"><CUSTOM0> 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"><CUSTOM0> 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"><CUSTOM0> 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"><CUSTOM0> Dessication</entry>
|
||||||
<entry id="43138" lang="en" sex="m">Untyped</entry>
|
<entry id="43138" lang="en" sex="m">Untyped</entry>
|
||||||
<entry id="43139" lang="en" sex="m">Untyped Damage</entry>
|
<entry id="43139" lang="en" sex="m">Untyped Damage</entry>
|
||||||
<entry id="43140" lang="en" sex="m"><CUSTOM0> Untyped</entry>
|
<entry id="43140" lang="en" sex="m"><CUSTOM0> Untyped</entry>
|
||||||
@@ -7347,7 +7365,7 @@ You make yourself - including clothing, armor, weapons and equipment - look diff
|
|||||||
<entry id="45448" lang="en" sex="m">Disguise Self, Normal Form</entry>
|
<entry id="45448" lang="en" sex="m">Disguise Self, Normal Form</entry>
|
||||||
<entry id="45449" lang="en" sex="m">Attune Gem</entry>
|
<entry id="45449" lang="en" sex="m">Attune Gem</entry>
|
||||||
<entry id="45450" lang="en" sex="m">Type of Feat: Item Creation
|
<entry id="45450" lang="en" sex="m">Type of Feat: Item Creation
|
||||||
Prerequisite: Intelligence 13, Arcane Spells level 3.
|
Prerequisite: Intelligence 13, Craft (General) 1, Arcane Spells level 3.
|
||||||
Specifics: You can cast any arcane spell you have prepared as a gem. The caster must have the spell memorized to be able to create the gem. Crafting a gem costs Spell level * Caster level * 50 in gold pieces for a normal caster (half base cost). It also takes XP equal to 1/25th of the base cost. If you cannot pay the casting cost or the XP loss would drop you a level, the crafting will fail, and the spell will be lost. Crafting the gem requires a gem with a value of 50gp * spell level. A gem is permanent until used. Gems target those who activate them.
|
Specifics: You can cast any arcane spell you have prepared as a gem. The caster must have the spell memorized to be able to create the gem. Crafting a gem costs Spell level * Caster level * 50 in gold pieces for a normal caster (half base cost). It also takes XP equal to 1/25th of the base cost. If you cannot pay the casting cost or the XP loss would drop you a level, the crafting will fail, and the spell will be lost. Crafting the gem requires a gem with a value of 50gp * spell level. A gem is permanent until used. Gems target those who activate them.
|
||||||
Use: Selected.</entry>
|
Use: Selected.</entry>
|
||||||
<entry id="45451" lang="en" sex="m">Epic Scout</entry>
|
<entry id="45451" lang="en" sex="m">Epic Scout</entry>
|
||||||
@@ -8349,7 +8367,7 @@ CLASS FEATURES:
|
|||||||
Level
|
Level
|
||||||
1: Shadow Sight - Gains Darkvision and Ultravision in darkness.
|
1: Shadow Sight - Gains Darkvision and Ultravision in darkness.
|
||||||
Shadow Jump - Dimension Door once per day per class level
|
Shadow Jump - Dimension Door once per day per class level
|
||||||
2: Shadow Blur - In darkness gains the benefit of Blur spell (20 % concealment in the night, underground area or Darkness spell).
|
2: Shadow Blur - In darkness gains the benefit of Blur spell (20% concealment while above ground at night or in a Darkness spell).
|
||||||
4: Shadow Pounce - May make a full attack after teleporting
|
4: Shadow Pounce - May make a full attack after teleporting
|
||||||
5: Shadow Discorporation - When any damage reduces him to 0 or less, has a chance to use teleport.
|
5: Shadow Discorporation - When any damage reduces him to 0 or less, has a chance to use teleport.
|
||||||
6: Death Attack - gains a Death Attack +1d6.
|
6: Death Attack - gains a Death Attack +1d6.
|
||||||
@@ -18304,7 +18322,12 @@ Duration: 1 rd/lvl
|
|||||||
Additional Counter Spells: Daylight
|
Additional Counter Spells: Daylight
|
||||||
Save: Will negate or none
|
Save: Will negate or none
|
||||||
Spell Resistance: Yes or No (object)
|
Spell Resistance: Yes or No (object)
|
||||||
All creatures within the area of effect are shrouded in a haze of darkness which can only be pierced by you.</entry>
|
|
||||||
|
You create an area of total darkness.
|
||||||
|
|
||||||
|
The darkness is impenetrable to normal vision and darkvision, but you can see normally within the blacklit area. Creatures outside the spell's area, even you, cannot see through it. You can cast the spell on a point in space, but the effect is stationary unless you cast it cast on a mobile object. You can cast the spell on a creature, and the effect then radiates from the creature and moves as it moves. Unattended objects and points in space do not get saving throws or benefit from spell resistance.
|
||||||
|
|
||||||
|
Blacklight counters or dispels any light spell of equal or lower level, such as daylight.</entry>
|
||||||
<entry id="48326" lang="en" sex="m">Dark Bolt (all Bolt)</entry>
|
<entry id="48326" lang="en" sex="m">Dark Bolt (all Bolt)</entry>
|
||||||
<entry id="48327" lang="en" sex="m">Dark Bolt (1 Bolt/rnd)</entry>
|
<entry id="48327" lang="en" sex="m">Dark Bolt (1 Bolt/rnd)</entry>
|
||||||
<entry id="48328" lang="en" sex="m">Anti-Paladin</entry>
|
<entry id="48328" lang="en" sex="m">Anti-Paladin</entry>
|
||||||
@@ -27344,7 +27367,7 @@ Save: Will negates
|
|||||||
Spell Resistance: Yes
|
Spell Resistance: Yes
|
||||||
|
|
||||||
This spell calms agitated creatures. You have no control over the affected creatures, but Calm Emotions can stop raging creatures from fighting or joyous ones from reveling. Creatures so affected cannot take violent actions (although they can defend themselves) or do anything destructive. Any aggressive action against or damage dealt to a calmed creature immediately breaks the spell on all calmed creatures.
|
This spell calms agitated creatures. You have no control over the affected creatures, but Calm Emotions can stop raging creatures from fighting or joyous ones from reveling. Creatures so affected cannot take violent actions (although they can defend themselves) or do anything destructive. Any aggressive action against or damage dealt to a calmed creature immediately breaks the spell on all calmed creatures.
|
||||||
This spell automatically suppresses any morale bonuses granted by spells such as Bless, Good Hope and Rage, as well as negating a Bard's ability to inspire courage or a Barbarian's rage ability. It also suppresses any feat effects and removes the Confused condition from all targets.</entry>
|
This spell automatically suppresses any morale bonuses granted by spells such as Bless, Good Hope and Rage, as well as negating a Bard's ability to inspire courage or a Barbarian's rage ability. It also suppresses any fear effects and removes the Confused condition from all targets.</entry>
|
||||||
<entry id="51124" lang="en" sex="m">Repulsion</entry>
|
<entry id="51124" lang="en" sex="m">Repulsion</entry>
|
||||||
<entry id="51125" lang="en" sex="m">School: Abjuration
|
<entry id="51125" lang="en" sex="m">School: Abjuration
|
||||||
Level: Cleric/Healer 7, Sorcerer/Wizard 6
|
Level: Cleric/Healer 7, Sorcerer/Wizard 6
|
||||||
@@ -56416,7 +56439,7 @@ REQUIREMENTS:
|
|||||||
Race: Dwarf.
|
Race: Dwarf.
|
||||||
Alignment: Any nonevil.
|
Alignment: Any nonevil.
|
||||||
Skills: Craft (armorsmithing) 8 ranks, Lore 2 ranks.
|
Skills: Craft (armorsmithing) 8 ranks, Lore 2 ranks.
|
||||||
Meldshaping: Ability to shape soulmelds
|
Meldshaping: Ability to shape soulmelds (requires a minimum of an 11 Constitution)
|
||||||
|
|
||||||
CLASS FEATURES:
|
CLASS FEATURES:
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user