diff --git a/PRC8_ChangeLog.txt b/PRC8_ChangeLog.txt index cf24ac25..f5e97b2e 100644 --- a/PRC8_ChangeLog.txt +++ b/PRC8_ChangeLog.txt @@ -1,3 +1,15 @@ +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 diff --git a/nwn/nwnprc/trunk/2das/damagetypes.2da b/nwn/nwnprc/trunk/2das/damagetypes.2da index 181dce5f..25b29934 100644 --- a/nwn/nwnprc/trunk/2das/damagetypes.2da +++ b/nwn/nwnprc/trunk/2das/damagetypes.2da @@ -1,26 +1,26 @@ 2DA V2.0 - Label CharsheetStrref DamageTypeGroup -0 Bludgeoning 58345 0 -1 Piercing 58341 0 -2 Slashing 58344 0 -3 Magical 58302 1 -4 Acid 58303 2 -5 Cold 58304 3 -6 Divine 58305 4 -7 Electrical 58306 5 -8 Fire 58308 6 -9 Negative 58309 7 -10 Positive 58310 8 -11 Sonic 58311 9 -12 Base 58301 0 -13 **** **** **** -14 Poison 16820368 11 -15 **** **** **** -16 Psychic 16820370 13 -17 **** **** **** -18 Radiant 16820372 15 -19 Force 16820373 16 -20 Untyped 16820355 17 -21 Vile 16820358 18 -22 **** **** **** + Label CharsheetStrref DamageTypeGroup +0 Bludgeoning 58345 0 +1 Piercing 58341 0 +2 Slashing 58344 0 +3 Magical 58302 1 +4 Acid 58303 2 +5 Cold 58304 3 +6 Divine 58305 4 +7 Electrical 58306 5 +8 Fire 58308 6 +9 Negative 58309 7 +10 Positive 58310 8 +11 Sonic 58311 9 +12 Base 58301 0 +13 CEP3_RESERVED **** **** +14 Poison 16820368 11 +15 CEP3_RESERVED **** **** +16 Psychic 16820370 13 +17 CEP3_RESERVED **** **** +18 Radiant 16820372 15 +19 Force 16820373 16 +20 Untyped 16820355 17 +21 Vile 16820358 18 +22 **** **** **** diff --git a/nwn/nwnprc/trunk/2das/effecticons.2da b/nwn/nwnprc/trunk/2das/effecticons.2da index 33b309ba..87ad3fca 100644 --- a/nwn/nwnprc/trunk/2das/effecticons.2da +++ b/nwn/nwnprc/trunk/2das/effecticons.2da @@ -1,133 +1,135 @@ 2DA V2.0 - Label Icon StrRef -0 **** **** 0 -1 DAMAGE_RESISTANCE ief_DamResist 8028 -2 REGENERATE ief_Regenerate 8029 -3 DAMAGE_REDUCTION ief_DamReduct 8030 -4 TEMPORARY_HITPOINTS ief_TempHP 8031 -5 ENTANGLE ief_Entangle 8032 -6 INVULNERABLE ief_Invulnerable 8033 -7 DEAF ief_Deaf 8034 -8 FATIGUE ief_Fatigue 8035 -9 IMMUNITY ief_Immunity 8036 -10 BLIND ief_Blind 8037 -11 ENEMY_ATTACK_BONUS ief_AttackBon 8038 -12 CHARMED ief_Charm 8039 -13 CONFUSED ief_Confuse 8040 -14 FRIGHTENED ief_Fear 8041 -15 DOMINATED ief_Dominate 8042 -16 PARALYZE ief_Paralyze 8043 -17 DAZED ief_Daze 8044 -18 STUNNED ief_Stun 8045 -19 SLEEP ief_Sleep 8046 -20 POISON ief_Poison 8047 -21 DISEASE ief_Disease 8048 -22 CURSE ief_Curse 8049 -23 SILENCE ief_Silence 8050 -24 TURNED ief_turned 8051 -25 HASTE ief_Haste 8052 -26 SLOW ief_Slow 8053 -27 ABILITY_INCREASE_STR ief_inc_str 58369 -28 ABILITY_DECREASE_STR ief_dec_str 58370 -29 ATTACK_INCREASE ief_AttIncr 8056 -30 ATTACK_DECREASE ief_AttDecr 8057 -31 DAMAGE_INCREASE ief_DamIncr 8058 -32 DAMAGE_DECREASE ief_DamDecr 8059 -33 DAMAGE_IMMUNITY_INCREASE ief_DamImmIncr 8060 -34 DAMAGE_IMMUNITY_DECREASE ief_DamImmDecr 8061 -35 AC_INCREASE ief_ACIncr 8062 -36 AC_DECREASE ief_ACDecr 8063 -37 MOVEMENT_SPEED_INCREASE ief_MoveIncr 8064 -38 MOVEMENT_SPEED_DECREASE ief_MoveDecr 8065 -39 SAVING_THROW_INCREASE ief_SaveIncr 8066 -40 SAVING_THROW_DECREASE ief_SaveDecr 8067 -41 SPELL_RESISTANCE_INCREASE ief_SRIncr 8068 -42 SPELL_RESISTANCE_DECREASE ief_SRDecr 8069 -43 SKILL_INCREASE ief_SkillIncr 8070 -44 SKILL_DECREASE ief_SkillDecr 8071 -45 INVISIBILITY ief_Invisible 8072 -46 IMPROVEDINVISIBILITY ief_ImpInvis 8073 -47 DARKNESS ief_Darkness 8074 -48 DISPELMAGICALL ief_DispelAll 8075 -49 ELEMENTALSHIELD ief_EleShield 8076 -50 LEVELDRAIN ief_LevelDrn 8077 -51 POLYMORPH ief_Polymorph 8078 -52 SANCTUARY ief_Sanctuary 8079 -53 TRUESEEING ief_TrueSee 8080 -54 SEEINVISIBILITY ief_SeeInvis 8081 -55 TIMESTOP ief_TimeStop 8082 -56 BLINDNESS ief_Blindness 8083 -57 SPELLLEVELABSORPTION ief_LevelAbs 8084 -58 DISPELMAGICBEST ief_DispelBest 8085 -59 ABILITY_INCREASE_DEX ief_inc_dex 58371 -60 ABILITY_DECREASE_DEX ief_dec_dex 58372 -61 ABILITY_INCREASE_CON ief_inc_con 58373 -62 ABILITY_DECREASE_CON ief_dec_con 58374 -63 ABILITY_INCREASE_INT ief_inc_int 58375 -64 ABILITY_DECREASE_INT ief_dec_int 58376 -65 ABILITY_INCREASE_WIS ief_inc_wis 58377 -66 ABILITY_DECREASE_WIS ief_dec_wis 58378 -67 ABILITY_INCREASE_CHA ief_inc_cha 58379 -68 ABILITY_DECREASE_CHA ief_dec_cha 58380 -69 IMMUNITY_ALL ief_Immunity 66128 -70 IMMUNITY_MIND ief_Immunitymi 66129 -71 IMMUNITY_POISON ief_Immunitypo 66130 -72 IMMUNITY_DISEASE ief_Immunitydi 66131 -73 IMMUNITY_FEAR ief_Immunityfe 66132 -74 IMMUNITY_TRAP ief_Immunitytrp 66134 -75 IMMUNITY_PARALYSIS ief_Immunitypa 66135 -76 IMMUNITY_BLINDNESS ief_Immunitybli 66136 -77 IMMUNITY_DEAFNESS ief_Immunitydef 66137 -78 IMMUNITY_SLOW ief_Immunitysl 66139 -79 IMMUNITY_ENTANGLE ief_Immunityen 66140 -80 IMMUNITY_SILENCE ief_Immunitysil 66141 -81 IMMUNITY_STUN ief_Immunityst 66142 -82 IMMUNITY_SLEEP ief_Immunityslp 66143 -83 IMMUNITY_CHARM ief_Immunitycha 66144 -84 IMMUNITY_DOMINATE ief_Immunitydom 66145 -85 IMMUNITY_CONFUSE ief_Immunitycon 66146 -86 IMMUNITY_CURSE ief_Immunitycur 66147 -87 IMMUNITY_DAZED ief_Immunitydaz 66148 -88 IMMUNITY_ABILITY_DECREASE ief_Immunityad 66149 -89 IMMUNITY_ATTACK_DECREASE ief_Immunityatd 66150 -90 IMMUNITY_DAMAGE_DECREASE ief_Immunitydmd 66151 -91 IMMUNITY_DAMAGE_IMMUNITY_DECREASE ief_Immunitydid 66153 -92 IMMUNITY_AC_DECREASE ief_Immunityacd 66154 -93 IMMUNITY_MOVEMENT_SPEED_DECREASE ief_Immunitymo 66156 -94 IMMUNITY_SAVING_THROW_DECREASE ief_Immunitysvd 66157 -95 IMMUNITY_SPELL_RESISTANCE_DECREASE ief_Immunitysrd 66158 -96 IMMUNITY_SKILL_DECREASE ief_Immunityskd 66159 -97 IMMUNITY_KNOCKDOWN ief_Immunitykno 66160 -98 IMMUNITY_NEGATIVE_LEVEL ief_Immunityne 66161 -99 IMMUNITY_SNEAK_ATTACK ief_Immunitysnk 66162 -100 IMMUNITY_CRITICAL_HIT ief_Immunitycr 66163 -101 IMMUNITY_DEATH_MAGIC ief_Immunityde 66164 -102 REFLEX_SAVE_INCREASED ief_SaveIncr 66231 -103 FORT_SAVE_INCREASED ief_SaveIncr 66232 -104 WILL_SAVE_INCREASED ief_SaveIncr 66233 -105 TAUNTED ief_taunted 67616 -106 SPELLIMMUNITY ief_Immunity 68482 -107 ETHEREALNESS ief_ether 2364 -108 CONCEALMENT ief_conceal 9001 -109 PETRIFIED ief_petrify 9002 -110 EFFECT_SPELL_FAILURE ief_spellfail 83317 -111 DAMAGE_IMMUNITY_MAGIC ief_DamImmIncrm 85544 -112 DAMAGE_IMMUNITY_ACID ief_DamImmIncra 85545 -113 DAMAGE_IMMUNITY_COLD ief_DamImmIncrc 85546 -114 DAMAGE_IMMUNITY_DIVINE ief_DamImmIncrd 85547 -115 DAMAGE_IMMUNITY_ELECTRICAL ief_DamImmIncre 85548 -116 DAMAGE_IMMUNITY_FIRE ief_DamImmIncrf 85549 -117 DAMAGE_IMMUNITY_NEGATIVE ief_DamImmIncrn 85550 -118 DAMAGE_IMMUNITY_POSITIVE ief_DamImmIncrp 85551 -119 DAMAGE_IMMUNITY_SONIC ief_DamImmIncrs 85552 -120 DAMAGE_IMMUNITY_MAGIC_DECREASE ief_DamImmDecrm 85553 -121 DAMAGE_IMMUNITY_ACID_DECREASE ief_DamImmDecra 85554 -122 DAMAGE_IMMUNITY_COLD_DECREASE ief_DamImmDecrc 85555 -123 DAMAGE_IMMUNITY_DIVINE_DECREASE ief_DamImmDecrd 85556 -124 DAMAGE_IMMUNITY_ELECTRICAL_DECREASE ief_DamImmDecre 85557 -125 DAMAGE_IMMUNITY_FIRE_DECREASE ief_DamImmDecrf 85558 -126 DAMAGE_IMMUNITY_NEGATIVE_DECREASE ief_DamImmDecrn 85559 -127 DAMAGE_IMMUNITY_POSITIVE_DECREASE ief_DamImmDecrp 85560 -128 DAMAGE_IMMUNITY_SONIC_DECREASE ief_DamImmDecrs 85561 -129 WOUNDING ief_Wounding 86782 + Label Icon StrRef +0 **** **** 0 +1 DAMAGE_RESISTANCE ief_DamResist 8028 +2 REGENERATE ief_Regenerate 8029 +3 DAMAGE_REDUCTION ief_DamReduct 8030 +4 TEMPORARY_HITPOINTS ief_TempHP 8031 +5 ENTANGLE ief_Entangle 8032 +6 INVULNERABLE ief_Invulnerable 8033 +7 DEAF ief_Deaf 8034 +8 FATIGUE ief_Fatigue 8035 +9 IMMUNITY ief_Immunity 8036 +10 BLIND ief_Blind 8037 +11 ENEMY_ATTACK_BONUS ief_AttackBon 8038 +12 CHARMED ief_Charm 8039 +13 CONFUSED ief_Confuse 8040 +14 FRIGHTENED ief_Fear 8041 +15 DOMINATED ief_Dominate 8042 +16 PARALYZE ief_Paralyze 8043 +17 DAZED ief_Daze 8044 +18 STUNNED ief_Stun 8045 +19 SLEEP ief_Sleep 8046 +20 POISON ief_Poison 8047 +21 DISEASE ief_Disease 8048 +22 CURSE ief_Curse 8049 +23 SILENCE ief_Silence 8050 +24 TURNED ief_turned 8051 +25 HASTE ief_Haste 8052 +26 SLOW ief_Slow 8053 +27 ABILITY_INCREASE_STR ief_inc_str 58369 +28 ABILITY_DECREASE_STR ief_dec_str 58370 +29 ATTACK_INCREASE ief_AttIncr 8056 +30 ATTACK_DECREASE ief_AttDecr 8057 +31 DAMAGE_INCREASE ief_DamIncr 8058 +32 DAMAGE_DECREASE ief_DamDecr 8059 +33 DAMAGE_IMMUNITY_INCREASE ief_DamImmIncr 8060 +34 DAMAGE_IMMUNITY_DECREASE ief_DamImmDecr 8061 +35 AC_INCREASE ief_ACIncr 8062 +36 AC_DECREASE ief_ACDecr 8063 +37 MOVEMENT_SPEED_INCREASE ief_MoveIncr 8064 +38 MOVEMENT_SPEED_DECREASE ief_MoveDecr 8065 +39 SAVING_THROW_INCREASE ief_SaveIncr 8066 +40 SAVING_THROW_DECREASE ief_SaveDecr 8067 +41 SPELL_RESISTANCE_INCREASE ief_SRIncr 8068 +42 SPELL_RESISTANCE_DECREASE ief_SRDecr 8069 +43 SKILL_INCREASE ief_SkillIncr 8070 +44 SKILL_DECREASE ief_SkillDecr 8071 +45 INVISIBILITY ief_Invisible 8072 +46 IMPROVEDINVISIBILITY ief_ImpInvis 8073 +47 DARKNESS ief_Darkness 8074 +48 DISPELMAGICALL ief_DispelAll 8075 +49 ELEMENTALSHIELD ief_EleShield 8076 +50 LEVELDRAIN ief_LevelDrn 8077 +51 POLYMORPH ief_Polymorph 8078 +52 SANCTUARY ief_Sanctuary 8079 +53 TRUESEEING ief_TrueSee 8080 +54 SEEINVISIBILITY ief_SeeInvis 8081 +55 TIMESTOP ief_TimeStop 8082 +56 BLINDNESS ief_Blindness 8083 +57 SPELLLEVELABSORPTION ief_LevelAbs 8084 +58 DISPELMAGICBEST ief_DispelBest 8085 +59 ABILITY_INCREASE_DEX ief_inc_dex 58371 +60 ABILITY_DECREASE_DEX ief_dec_dex 58372 +61 ABILITY_INCREASE_CON ief_inc_con 58373 +62 ABILITY_DECREASE_CON ief_dec_con 58374 +63 ABILITY_INCREASE_INT ief_inc_int 58375 +64 ABILITY_DECREASE_INT ief_dec_int 58376 +65 ABILITY_INCREASE_WIS ief_inc_wis 58377 +66 ABILITY_DECREASE_WIS ief_dec_wis 58378 +67 ABILITY_INCREASE_CHA ief_inc_cha 58379 +68 ABILITY_DECREASE_CHA ief_dec_cha 58380 +69 IMMUNITY_ALL ief_Immunity 66128 +70 IMMUNITY_MIND ief_Immunitymi 66129 +71 IMMUNITY_POISON ief_Immunitypo 66130 +72 IMMUNITY_DISEASE ief_Immunitydi 66131 +73 IMMUNITY_FEAR ief_Immunityfe 66132 +74 IMMUNITY_TRAP ief_Immunitytrp 66134 +75 IMMUNITY_PARALYSIS ief_Immunitypa 66135 +76 IMMUNITY_BLINDNESS ief_Immunitybli 66136 +77 IMMUNITY_DEAFNESS ief_Immunitydef 66137 +78 IMMUNITY_SLOW ief_Immunitysl 66139 +79 IMMUNITY_ENTANGLE ief_Immunityen 66140 +80 IMMUNITY_SILENCE ief_Immunitysil 66141 +81 IMMUNITY_STUN ief_Immunityst 66142 +82 IMMUNITY_SLEEP ief_Immunityslp 66143 +83 IMMUNITY_CHARM ief_Immunitycha 66144 +84 IMMUNITY_DOMINATE ief_Immunitydom 66145 +85 IMMUNITY_CONFUSE ief_Immunitycon 66146 +86 IMMUNITY_CURSE ief_Immunitycur 66147 +87 IMMUNITY_DAZED ief_Immunitydaz 66148 +88 IMMUNITY_ABILITY_DECREASE ief_Immunityad 66149 +89 IMMUNITY_ATTACK_DECREASE ief_Immunityatd 66150 +90 IMMUNITY_DAMAGE_DECREASE ief_Immunitydmd 66151 +91 IMMUNITY_DAMAGE_IMMUNITY_DECREASE ief_Immunitydid 66153 +92 IMMUNITY_AC_DECREASE ief_Immunityacd 66154 +93 IMMUNITY_MOVEMENT_SPEED_DECREASE ief_Immunitymo 66156 +94 IMMUNITY_SAVING_THROW_DECREASE ief_Immunitysvd 66157 +95 IMMUNITY_SPELL_RESISTANCE_DECREASE ief_Immunitysrd 66158 +96 IMMUNITY_SKILL_DECREASE ief_Immunityskd 66159 +97 IMMUNITY_KNOCKDOWN ief_Immunitykno 66160 +98 IMMUNITY_NEGATIVE_LEVEL ief_Immunityne 66161 +99 IMMUNITY_SNEAK_ATTACK ief_Immunitysnk 66162 +100 IMMUNITY_CRITICAL_HIT ief_Immunitycr 66163 +101 IMMUNITY_DEATH_MAGIC ief_Immunityde 66164 +102 REFLEX_SAVE_INCREASED ief_SaveIncr 66231 +103 FORT_SAVE_INCREASED ief_SaveIncr 66232 +104 WILL_SAVE_INCREASED ief_SaveIncr 66233 +105 TAUNTED ief_taunted 67616 +106 SPELLIMMUNITY ief_Immunity 68482 +107 ETHEREALNESS ief_ether 2364 +108 CONCEALMENT ief_conceal 9001 +109 PETRIFIED ief_petrify 9002 +110 EFFECT_SPELL_FAILURE ief_spellfail 83317 +111 DAMAGE_IMMUNITY_MAGIC ief_DamImmIncrm 85544 +112 DAMAGE_IMMUNITY_ACID ief_DamImmIncra 85545 +113 DAMAGE_IMMUNITY_COLD ief_DamImmIncrc 85546 +114 DAMAGE_IMMUNITY_DIVINE ief_DamImmIncrd 85547 +115 DAMAGE_IMMUNITY_ELECTRICAL ief_DamImmIncre 85548 +116 DAMAGE_IMMUNITY_FIRE ief_DamImmIncrf 85549 +117 DAMAGE_IMMUNITY_NEGATIVE ief_DamImmIncrn 85550 +118 DAMAGE_IMMUNITY_POSITIVE ief_DamImmIncrp 85551 +119 DAMAGE_IMMUNITY_SONIC ief_DamImmIncrs 85552 +120 DAMAGE_IMMUNITY_MAGIC_DECREASE ief_DamImmDecrm 85553 +121 DAMAGE_IMMUNITY_ACID_DECREASE ief_DamImmDecra 85554 +122 DAMAGE_IMMUNITY_COLD_DECREASE ief_DamImmDecrc 85555 +123 DAMAGE_IMMUNITY_DIVINE_DECREASE ief_DamImmDecrd 85556 +124 DAMAGE_IMMUNITY_ELECTRICAL_DECREASE ief_DamImmDecre 85557 +125 DAMAGE_IMMUNITY_FIRE_DECREASE ief_DamImmDecrf 85558 +126 DAMAGE_IMMUNITY_NEGATIVE_DECREASE ief_DamImmDecrn 85559 +127 DAMAGE_IMMUNITY_POSITIVE_DECREASE ief_DamImmDecrp 85560 +128 DAMAGE_IMMUNITY_SONIC_DECREASE ief_DamImmDecrs 85561 +129 WOUNDING ief_Wounding 86782 +130 DARKVISION ief_darkvis 1493 +131 ULTRAVISION ief_ultravis 6331 diff --git a/nwn/nwnprc/trunk/2das/spells.2da b/nwn/nwnprc/trunk/2das/spells.2da index f618439a..ea297a9d 100644 --- a/nwn/nwnprc/trunk/2das/spells.2da +++ b/nwn/nwnprc/trunk/2das/spells.2da @@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** -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 **** **** **** **** **** **** **** **** **** **** **** 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** @@ -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 **** 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** diff --git a/nwn/nwnprc/trunk/2das/vfx_persistent.2da b/nwn/nwnprc/trunk/2das/vfx_persistent.2da index c0b5b6af..fd6dbdce 100644 --- a/nwn/nwnprc/trunk/2das/vfx_persistent.2da +++ b/nwn/nwnprc/trunk/2das/vfx_persistent.2da @@ -170,7 +170,7 @@ 166 AOE_PER_DESERT_TEMPEST C 1.3 **** **** tob_dw_dsttmpta **** **** 0 274 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 167 AOE_MOB_MOUNTAIN_AVALANCHE C 1 **** **** tob_stdr_mtavlA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 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 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** @@ -206,7 +206,7 @@ 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 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** **** 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 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 diff --git a/nwn/nwnprc/trunk/gfx/ief_ultravis.tga b/nwn/nwnprc/trunk/gfx/ief_ultravis.tga new file mode 100644 index 00000000..1fc0451d Binary files /dev/null and b/nwn/nwnprc/trunk/gfx/ief_ultravis.tga differ diff --git a/nwn/nwnprc/trunk/gfx/im_thicketblades.tga b/nwn/nwnprc/trunk/gfx/im_thicketblades.tga new file mode 100644 index 00000000..9004ba46 Binary files /dev/null and b/nwn/nwnprc/trunk/gfx/im_thicketblades.tga differ diff --git a/nwn/nwnprc/trunk/include/inc_timestop.nss b/nwn/nwnprc/trunk/include/inc_timestop.nss index bd624e9a..df538782 100644 --- a/nwn/nwnprc/trunk/include/inc_timestop.nss +++ b/nwn/nwnprc/trunk/include/inc_timestop.nss @@ -73,6 +73,7 @@ void RemoveTSFromObject(object oTarget) || nSpellId == 14205 // POWER_TEMPORALACCELERATION || nSpellId == 17366 // MOVE_DM_MOMENT_ALACRITY || nSpellId == 17511 // MOVE_WR_WHITE_RAVEN_TACTICS + || nSpellId == 18428 // MYST_SHADOW_TIME ) RemoveEffect(oTarget, eTest); eTest = GetNextEffect(oTarget); @@ -81,3 +82,5 @@ void RemoveTSFromObject(object oTarget) StopFade(oTarget); SetCommandable(TRUE, oTarget); } + +//void main(){} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/include/prc_feat_const.nss b/nwn/nwnprc/trunk/include/prc_feat_const.nss index 1452fabf..b2e0d35a 100644 --- a/nwn/nwnprc/trunk/include/prc_feat_const.nss +++ b/nwn/nwnprc/trunk/include/prc_feat_const.nss @@ -2235,6 +2235,7 @@ const int FEAT_INSECT_PLAGUE = 2312; //CONSTANT const int FEAT_SUMMON_CORNUGON = 2313; //CONSTANT const int FEAT_BEGUILEING_NATURE = 2314; //CONSTANT +//:: Fist of Hextor Feats const int FEAT_DEVICE_LORE = 2333; const int FEAT_IRON_HEWS = 2334; 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_BODY = 2341; +//:: Telflammar Shadowlord Feats +const int FEAT_SHADOWDISCORPO = 3305; + const int FEAT_COFFIN_SANCTUARY = 2343; const int FEAT_GASEOUS_FORM = 2344; diff --git a/nwn/nwnprc/trunk/include/prc_inc_combat.nss b/nwn/nwnprc/trunk/include/prc_inc_combat.nss index 74b7e5b7..96ace036 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_combat.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_combat.nss @@ -8803,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)); // 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 if (sAttackVars.iAttackNumber && !sAttackVars.bApplyTouchToAll) sAttackVars.iTouchAttackType == FALSE; diff --git a/nwn/nwnprc/trunk/include/prc_inc_core.nss b/nwn/nwnprc/trunk/include/prc_inc_core.nss index ecc19d65..eed7c0fc 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_core.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_core.nss @@ -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 // 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 + 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 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 // 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; // spontaneous casters have all their known spells as hide feats @@ -703,7 +750,8 @@ int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJ return FALSE; } - + */ + //routes to action cast spell, but puts a wrapper around to tell other functions its a //SLA, so dont craft etc //also defaults th totalDC to 10+spellevel+chamod diff --git a/nwn/nwnprc/trunk/include/prc_inc_function.nss b/nwn/nwnprc/trunk/include/prc_inc_function.nss index 246dea4b..e09c7870 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_function.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_function.nss @@ -214,6 +214,7 @@ void SetupCharacterData(object oPC) case CLASS_TYPE_SHADOWSMITH: iData |= 0x01; break; case CLASS_TYPE_SHADOW_SUN_NINJA: sScript = "tob_shadowsun"; 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_SHADOWBANE_STALKER: sScript = "prc_shadstalker"; break; case CLASS_TYPE_SHADOW_THIEF_AMN: sScript = "prc_amn"; break; @@ -237,7 +238,7 @@ void SetupCharacterData(object oPC) case CLASS_TYPE_SWIFT_WING: sScript = "prc_swiftwing"; break; case CLASS_TYPE_SWORDSAGE: sScript = "tob_swordsage"; iData |= 0x01; break; case CLASS_TYPE_TALON_OF_TIAMAT: sScript = "prc_talontiamat"; break; - case CLASS_TYPE_TEMPEST: sScript = "prc_tempest"; break; + case CLASS_TYPE_TEMPEST: sScript = "prc_tempest"; break; case CLASS_TYPE_TEMPUS: sScript = "prc_battletempus"; break; case CLASS_TYPE_TENEBROUS_APOSTATE: sScript = "bnd_tenebrous"; break; case CLASS_TYPE_THAYAN_KNIGHT: sScript = "prc_thayknight"; break; diff --git a/nwn/nwnprc/trunk/include/prc_inc_spells.nss b/nwn/nwnprc/trunk/include/prc_inc_spells.nss index 4ecaea78..37278892 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_spells.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_spells.nss @@ -20,6 +20,26 @@ /* 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 @@ -381,6 +401,30 @@ const int TYPE_DIVINE = -2; /* 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 int GetIsSubradialSpell(int nSpellID) diff --git a/nwn/nwnprc/trunk/include/prc_inc_switch.nss b/nwn/nwnprc/trunk/include/prc_inc_switch.nss index 20f4d8cb..b0b6b92b 100644 --- a/nwn/nwnprc/trunk/include/prc_inc_switch.nss +++ b/nwn/nwnprc/trunk/include/prc_inc_switch.nss @@ -205,7 +205,7 @@ const string PRC_PNP_FIND_TRAPS = "PRC_PNP_FIND_TRAPS"; /** * 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"; diff --git a/nwn/nwnprc/trunk/include/prc_misc_const.nss b/nwn/nwnprc/trunk/include/prc_misc_const.nss index 15ea18fb..055f30d5 100644 --- a/nwn/nwnprc/trunk/include/prc_misc_const.nss +++ b/nwn/nwnprc/trunk/include/prc_misc_const.nss @@ -3,9 +3,26 @@ * Include file for various constants that don't really belong in any of the other files, * 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 + + +//::////////////////////////////////////////////// +//:: New base item types //::////////////////////////////////////////////// const int BASE_ITEM_GOLEM = 23; //:: not actually used for anything else diff --git a/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss b/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss index e68858f8..321dbded 100644 --- a/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss +++ b/nwn/nwnprc/trunk/include/x2_inc_spellhook.nss @@ -2725,7 +2725,41 @@ int X2GetSpellCastOnSequencerItem(object oItem, object oCaster, int nSpellID, in // * This is our little concentration system for black blade of disaster // * if the mage tries to cast any kind of spell, the blade is signaled an event to die //------------------------------------------------------------------------------ -void X2BreakConcentrationSpells() +void X2BreakConcentrationSpells() +{ + //end Dragonsong Lyrist songs + 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"); @@ -2747,7 +2781,7 @@ void X2BreakConcentrationSpells() } } } -} +} */ //------------------------------------------------------------------------------ // being hit by any kind of negative effect affecting the caster's ability to concentrate diff --git a/nwn/nwnprc/trunk/newspellbook/inv_verminlrddom.nss b/nwn/nwnprc/trunk/newspellbook/inv_verminlrddom.nss index 26d4089a..df85446d 100644 --- a/nwn/nwnprc/trunk/newspellbook/inv_verminlrddom.nss +++ b/nwn/nwnprc/trunk/newspellbook/inv_verminlrddom.nss @@ -1,11 +1,42 @@ -/* - Warlock epic feat - Verminlord dominating vermin -*/ -#include "prc_inc_racial" -#include "inv_inc_invfunc" +/* + Warlock epic feat + Verminlord dominating vermin -void main() + Fixed By: Jaysyn + Date: 2026-05-27 19:43:38 +*/ +#include "prc_inc_racial" +#include "inv_inc_invfunc" +#include "prc_inc_spells" + +void main() +{ + object oTarget = PRCGetSpellTargetObject(); + 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); @@ -15,3 +46,4 @@ void main() DoRacialSLA(SPELL_DOMINATE_MONSTER, GetInvokerLevel(OBJECT_SELF, CLASS_TYPE_WARLOCK)); } + */ \ No newline at end of file diff --git a/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwna.nss b/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwna.nss index cdb5c6a1..691deb76 100644 --- a/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwna.nss +++ b/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwna.nss @@ -28,6 +28,14 @@ void main() effect eDark = EffectDarkness(); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); 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"); diff --git a/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwnb.nss b/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwnb.nss index c528cc2b..059209d7 100644 --- a/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwnb.nss +++ b/nwn/nwnprc/trunk/newspellbook/shd_myst_dskdwnb.nss @@ -24,6 +24,17 @@ void main() object oTarget = GetExitingObject(); 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 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)) diff --git a/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshda.nss b/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshda.nss index 538a6b48..302e88c4 100644 --- a/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshda.nss +++ b/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshda.nss @@ -35,7 +35,15 @@ void main() effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); effect eLink = EffectLinkEffects(eDark, eDur); - 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) { diff --git a/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshdb.nss b/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshdb.nss index caeb5d04..5f5ea177 100644 --- a/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshdb.nss +++ b/nwn/nwnprc/trunk/newspellbook/shd_myst_grpshdb.nss @@ -28,6 +28,18 @@ void main() // Loop over effects, removing the ones from this power 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)) { //Search through the valid effects on the target. diff --git a/nwn/nwnprc/trunk/newspellbook/tob_ssn_childsl.nss b/nwn/nwnprc/trunk/newspellbook/tob_ssn_childsl.nss index fd838f48..c9f60d6b 100644 --- a/nwn/nwnprc/trunk/newspellbook/tob_ssn_childsl.nss +++ b/nwn/nwnprc/trunk/newspellbook/tob_ssn_childsl.nss @@ -66,6 +66,14 @@ void main() while(GetIsObjectValid(oTarget)) {// Applies to everyone 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)); } diff --git a/nwn/nwnprc/trunk/psionics/psi_pow_empfeed.nss b/nwn/nwnprc/trunk/psionics/psi_pow_empfeed.nss index 07fa8974..9f8e5cdd 100644 --- a/nwn/nwnprc/trunk/psionics/psi_pow_empfeed.nss +++ b/nwn/nwnprc/trunk/psionics/psi_pow_empfeed.nss @@ -64,7 +64,7 @@ void main() { int nDamage = 5 + manif.nTimesAugOptUsed_1; 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; // Get the OnHitCast: Unique on the target's armor / hide diff --git a/nwn/nwnprc/trunk/scripts/prc_onhb_indiv.nss b/nwn/nwnprc/trunk/scripts/prc_onhb_indiv.nss index ac06d546..bf7ed6b3 100644 --- a/nwn/nwnprc/trunk/scripts/prc_onhb_indiv.nss +++ b/nwn/nwnprc/trunk/scripts/prc_onhb_indiv.nss @@ -102,7 +102,19 @@ void main() DelayCommand(6.0, ExecuteScript("prc_onhb_indiv", oPC)); } - /* PC_damage code to support oni's scripts + // 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 * If HP is over 1 apply the damage and let * the OnDying deal with the consequences */ diff --git a/nwn/nwnprc/trunk/scripts/prc_shadowlord.nss b/nwn/nwnprc/trunk/scripts/prc_shadowlord.nss index 29a8769d..14d8041d 100644 --- a/nwn/nwnprc/trunk/scripts/prc_shadowlord.nss +++ b/nwn/nwnprc/trunk/scripts/prc_shadowlord.nss @@ -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_class_const" #include "prc_spell_const" @@ -36,18 +59,50 @@ void Discorp(object oPC,int iEquip) } - void main() { - //Declare main variables. - object oPC = OBJECT_SELF; - object oSkin = GetPCSkin(oPC); + //:: Declare main variables. + object oPC = OBJECT_SELF; + object oSkin = GetPCSkin(oPC); + object oArea = GetArea(oPC); + + 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"); + } - int bDiscor= GetHasFeat(FEAT_SHADOWDISCOPOR, oPC) ? 1 : 0; + 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 (bDiscor>0) Discorp(oPC,GetLocalInt(oPC,"ONEQUIP")); - - -} + if (bDiscor>0) Discorp(oPC,GetLocalInt(oPC,"ONEQUIP")); */ + +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/spells/nw_s0_darknessa.nss b/nwn/nwnprc/trunk/spells/nw_s0_darknessa.nss index 3ec7d660..7dbf0d2a 100644 --- a/nwn/nwnprc/trunk/spells/nw_s0_darknessa.nss +++ b/nwn/nwnprc/trunk/spells/nw_s0_darknessa.nss @@ -1,105 +1,107 @@ -//:://///////////////////////////////////////////// -//:: Darkness: On Enter -//:: NW_S0_DarknessA.nss -//:: Copyright (c) 2001 Bioware Corp. -//::////////////////////////////////////////////// -/* - Creates a globe of darkness around those in the area - of effect. -*/ -//::////////////////////////////////////////////// -//:: Created By: Preston Watamaniuk -//:: Created On: Feb 28, 2002 -//::////////////////////////////////////////////// - -//:: modified by mr_bumpkin Dec 4, 2003 +//:://///////////////////////////////////////////// +//:: Darkness: On Enter +//:: NW_S0_DarknessA.nss +//:: Copyright (c) 2001 Bioware Corp. +//::////////////////////////////////////////////// +/* + Creates a globe of darkness around those in the area + of effect. +*/ +//::////////////////////////////////////////////// +//:: Created By: Preston Watamaniuk +//:: Created On: Feb 28, 2002 +//::////////////////////////////////////////////// + +//:: modified by mr_bumpkin Dec 4, 2003 #include "prc_inc_spells" - -void main() -{ -DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); -SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION); - - int nMetaMagic = PRCGetMetaMagicFeat(); - effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS); - effect eDark = EffectDarkness(); - effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); - - effect eLink = EffectLinkEffects(eDark, eDur); - eLink = TagEffect(eLink, "BIO_DARKNESS"); - - effect eLink2 = EffectLinkEffects(eInvis, eDur); - eLink2 = TagEffect(eLink2, "PNP_DARKNESS"); - - effect ePnP = EffectLinkEffects(eDur, EffectDarkness()); - if(GetPRCSwitch(PRC_PNP_DARKNESS_35ED)) - { - ePnP = EffectLinkEffects(eDur, EffectConcealment(20)); - ePnP = TagEffect(ePnP, "PNP35_DARKNESS"); - } - - object oTarget = GetEnteringObject(); - int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD,oTarget); - - if (iShadow) - SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE); - if (iShadow>1) - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE); - - - int nDuration = PRCGetCasterLevel(OBJECT_SELF); - //Enter Metamagic conditions - if ((nMetaMagic & METAMAGIC_EXTEND)) - { - nDuration = nDuration *2; //Duration is +100% - } - - - // * July 2003: If has darkness then do not put it on it again - // Primogenitor: Yes, what about overlapping darkness effects by different casters? - //if (PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oTarget) == TRUE) - //{ - // return; - //} - - if(GetIsObjectValid(oTarget) && oTarget != GetAreaOfEffectCreator()) - { - if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator())) - { - SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId())); - } - else - { - SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), 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 - //Fire cast spell at event for the specified target - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget,0.0f,FALSE); - } - } - else if (oTarget == GetAreaOfEffectCreator()) - { - SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE)); - //Fire cast spell at event for the specified target - if(GetPRCSwitch(PRC_PNP_DARKNESS)) - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE); - else - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE); - } - - -DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); -// Getting rid of the local integer storing the spellschool name - -} - - - +void main() +{ + DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); + SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION); + + int nMetaMagic = PRCGetMetaMagicFeat(); + effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS); + effect eDark = EffectDarkness(); + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + + effect eLink = EffectLinkEffects(eDark, eDur); + eLink = TagEffect(eLink, "BIO_DARKNESS"); + + effect eLink2 = EffectLinkEffects(eInvis, eDur); + eLink2 = TagEffect(eLink2, "PNP_DARKNESS"); + + effect ePnP = EffectLinkEffects(eDur, EffectDarkness()); + if(GetPRCSwitch(PRC_PNP_DARKNESS_35ED)) + { + ePnP = EffectLinkEffects(eDur, EffectConcealment(20)); + ePnP = TagEffect(ePnP, "PNP35_DARKNESS"); + } + + object oTarget = GetEnteringObject(); + 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(OBJECT_SELF); + //Enter Metamagic conditions + if ((nMetaMagic & METAMAGIC_EXTEND)) + { + nDuration = nDuration *2; //Duration is +100% + } + + + // * July 2003: If has darkness then do not put it on it again + // Primogenitor: Yes, what about overlapping darkness effects by different casters? + //if (PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oTarget) == TRUE) + //{ + // return; + //} + + if(GetIsObjectValid(oTarget) && oTarget != GetAreaOfEffectCreator()) + { + if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator())) + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId())); + } + else + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), 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 + //Fire cast spell at event for the specified target + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget,0.0f,FALSE); + } + } + else if (oTarget == GetAreaOfEffectCreator()) + { + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), 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, eLink2, oTarget,0.0f,FALSE); + } + + + +DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); +// Getting rid of the local integer storing the spellschool name + +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/spells/nw_s0_darknessb.nss b/nwn/nwnprc/trunk/spells/nw_s0_darknessb.nss index 00023e47..f42e2e58 100644 --- a/nwn/nwnprc/trunk/spells/nw_s0_darknessb.nss +++ b/nwn/nwnprc/trunk/spells/nw_s0_darknessb.nss @@ -59,7 +59,13 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION); effect eEffect = GetFirstEffect(oTarget); while(GetIsEffectValid(eEffect)) { - if(GetEffectTag(eEffect) == "PNP_DARKNESS") + if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR") + { + RemoveEffect(oTarget, eEffect); + if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR"); + } + + if(GetEffectTag(eEffect) == "PNP_DARKNESS") RemoveEffect(oTarget, eEffect); if(GetEffectTag(eEffect) == "PNP35_DARKNESS") @@ -71,6 +77,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION); eEffect = GetNextEffect(oTarget); } + DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); // Getting rid of the local integer storing the spellschool name } diff --git a/nwn/nwnprc/trunk/spells/sp_blacklight.nss b/nwn/nwnprc/trunk/spells/sp_blacklight.nss index d6b3086e..de08a06d 100644 --- a/nwn/nwnprc/trunk/spells/sp_blacklight.nss +++ b/nwn/nwnprc/trunk/spells/sp_blacklight.nss @@ -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_alterations" @@ -46,5 +69,4 @@ void main() SetAllAoEInts(SPELL_BLACKLIGHT, oAoE, PRCGetSpellSaveDC(SPELL_BLACKLIGHT, SPELL_SCHOOL_EVOCATION), 0, nCastLvl); PRCSetSchool(); - -} +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/spells/sp_blacklighta.nss b/nwn/nwnprc/trunk/spells/sp_blacklighta.nss index 1325ef0a..1f03db3e 100644 --- a/nwn/nwnprc/trunk/spells/sp_blacklighta.nss +++ b/nwn/nwnprc/trunk/spells/sp_blacklighta.nss @@ -1,15 +1,28 @@ //:://///////////////////////////////////////////// -//:: Darkness: On Enter -//:: NW_S0_DarknessA.nss -//:: Copyright (c) 2001 Bioware Corp. +//:: Blacklight: On Enter +//:: sp_blacklighta.nss //::////////////////////////////////////////////// /* - Creates a globe of darkness around those in the area - of effect. + 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. */ //::////////////////////////////////////////////// -//:: Created By: Preston Watamaniuk -//:: Created On: Feb 28, 2002 +//:: Created By: Jaysyn +//:: Created On: 2026-05-28 12:07:02 //::////////////////////////////////////////////// #include "prc_alterations" #include "prc_inc_spells" @@ -18,51 +31,51 @@ void main() { PRCSetSchool(SPELL_SCHOOL_EVOCATION); - int nMetaMagic = PRCGetMetaMagicFeat(); - effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS); - effect eInvis2 = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED); - effect eDarkv = EffectUltravision(); - effect eCounc=EffectConcealment(50); - effect eDark = EffectDarkness(); - effect eBlind= EffectBlindness(); - effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); - effect eLink = EffectLinkEffects(eDark, eDur); - eLink = EffectLinkEffects(eLink, eBlind); - effect eLink2 = EffectLinkEffects(eInvis, eDur); + int nMetaMagic = PRCGetMetaMagicFeat(); + effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS); + effect eInvis2 = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED); + effect eDarkv = EffectUltravision(); + effect eCounc = EffectConcealment(20); + effect eDark = EffectDarkness(); + effect eBlind = EffectBlindness(); + + effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE); + effect eLink = EffectLinkEffects(eDark, eDur); + eLink = EffectLinkEffects(eLink, eBlind); + effect eLink2 = EffectLinkEffects(eInvis, eDur); - eLink2=EffectLinkEffects(eInvis2,eDur); - eLink2=EffectLinkEffects(eDarkv, eLink2); - eLink2=EffectLinkEffects(eLink2,eCounc); - - object oTarget = GetEnteringObject(); - - int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD,oTarget); - - if (iShadow) - SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE); - if (iShadow>1) - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE); + eLink2 = EffectLinkEffects(eInvis2,eDur); + eLink2 = EffectLinkEffects(eDarkv, eLink2); + eLink2 = EffectLinkEffects(eLink2,eCounc); + object oTarget = GetEnteringObject(); + int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget); + + if (iShadow) + { + eLink = ShadowlordEffects(iShadow, eLink); + eLink2 = ShadowlordEffects(iShadow, eLink2); + eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR"); + eLink2 = TagEffect(eLink2, "SHADOWSIGHT+BLUR"); + } if(GetIsObjectValid(oTarget) && oTarget != 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 if (!PRCDoResistSpell(OBJECT_SELF, oTarget,SPGetPenetrAOE(GetAreaOfEffectCreator()))) { - if (!iShadow) //Fire cast spell at event for the specified target SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); } } else { - SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DARKNESS, FALSE)); - if (!iShadow) - //Fire cast spell at event for the specified target - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); + SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_BLACKLIGHT, FALSE)); + //Fire cast spell at event for the specified target + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); } } @@ -75,4 +88,4 @@ void main() } PRCSetSchool(); -} +} \ No newline at end of file diff --git a/nwn/nwnprc/trunk/spells/sp_blacklightb.nss b/nwn/nwnprc/trunk/spells/sp_blacklightb.nss index cce42b0f..11e24a96 100644 --- a/nwn/nwnprc/trunk/spells/sp_blacklightb.nss +++ b/nwn/nwnprc/trunk/spells/sp_blacklightb.nss @@ -16,7 +16,7 @@ void main() { int nID = GetEffectSpellId(eAOE); - if( nID== SPELL_UR_BLACKLIGHT) + if( nID== SPELL_BLACKLIGHT) { if (GetEffectCreator(eAOE) == oCreator) RemoveEffect(oTarget, eAOE); @@ -26,6 +26,17 @@ void main() //Get next effect on the target 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(); diff --git a/nwn/nwnprc/trunk/spells/sp_cloud_achaiA.nss b/nwn/nwnprc/trunk/spells/sp_cloud_achaiA.nss index 18b63a02..41343c7d 100644 --- a/nwn/nwnprc/trunk/spells/sp_cloud_achaiA.nss +++ b/nwn/nwnprc/trunk/spells/sp_cloud_achaiA.nss @@ -37,7 +37,17 @@ void main() { 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 // Primogenitor: Yes, what about overlapping darkness effects by different casters? //if (PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oTarget) == TRUE) diff --git a/nwn/nwnprc/trunk/spells/sp_cloud_achaiB.nss b/nwn/nwnprc/trunk/spells/sp_cloud_achaiB.nss index 87148b0f..c8e9477f 100644 --- a/nwn/nwnprc/trunk/spells/sp_cloud_achaiB.nss +++ b/nwn/nwnprc/trunk/spells/sp_cloud_achaiB.nss @@ -40,6 +40,16 @@ void main() //Get next effect on the target 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(); } diff --git a/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss b/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss index 5985cd86..d9011292 100644 --- a/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss +++ b/nwn/nwnprc/trunk/spells/sp_damng_darkA.nss @@ -65,14 +65,20 @@ void main() ePnP = TagEffect(ePnP, "PNP35_DARKNESS"); } - object oTarget = GetEnteringObject(); object oPC = GetAreaOfEffectCreator(); - int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD,oTarget); - if (iShadow) - SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE); - if (iShadow>1) - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE); + 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)) diff --git a/nwn/nwnprc/trunk/spells/sp_damng_darkB.nss b/nwn/nwnprc/trunk/spells/sp_damng_darkB.nss index 293defac..03e8796d 100644 --- a/nwn/nwnprc/trunk/spells/sp_damng_darkB.nss +++ b/nwn/nwnprc/trunk/spells/sp_damng_darkB.nss @@ -47,8 +47,8 @@ void main() object oTarget = GetExitingObject(); object oPC = GetAreaOfEffectCreator(); - effect eAOE; - + effect eAOE; + // Clear the in-AOE marker to stop damage tracking DeleteLocalInt(oTarget, "PRC_DamningDarkness_InAOE"); @@ -72,6 +72,18 @@ void main() //Get next effect on the target 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(); } \ No newline at end of file diff --git a/nwn/nwnprc/trunk/spells/sp_moral_undn.nss b/nwn/nwnprc/trunk/spells/sp_moral_undn.nss index 97cbfa49..a3bb490a 100644 --- a/nwn/nwnprc/trunk/spells/sp_moral_undn.nss +++ b/nwn/nwnprc/trunk/spells/sp_moral_undn.nss @@ -65,7 +65,17 @@ void main() //Spell Resist 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)) { //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 //improved their alignment any while evil. They might be restored to 85 instead. DelayCommand(fDur, AdjustAlignment(oTarget, ALIGNMENT_GOOD, (100 + nGoodEvil), FALSE)); - } + } */ } //SPEvilShift(oPC); diff --git a/nwn/nwnprc/trunk/spells/sp_utterdarkA.nss b/nwn/nwnprc/trunk/spells/sp_utterdarkA.nss index 9498b8ab..cca1a295 100644 --- a/nwn/nwnprc/trunk/spells/sp_utterdarkA.nss +++ b/nwn/nwnprc/trunk/spells/sp_utterdarkA.nss @@ -43,22 +43,46 @@ void main() effect eLink = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS); 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(); - + 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(GetIsObjectValid(oTarget) && oTarget != oPC) - { - if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL) - { - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDark, oTarget); - } - - else - { - SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); - } - } + if(GetIsObjectValid(oTarget) && oTarget != oPC) + { + if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL) + { + 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 + { + SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget); + } + } PRCSetSchool(); } diff --git a/nwn/nwnprc/trunk/spells/sp_utterdarkB.nss b/nwn/nwnprc/trunk/spells/sp_utterdarkB.nss index 1c03747d..5642d585 100644 --- a/nwn/nwnprc/trunk/spells/sp_utterdarkB.nss +++ b/nwn/nwnprc/trunk/spells/sp_utterdarkB.nss @@ -54,6 +54,12 @@ void main() 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 eAOE = GetNextEffect(oTarget); } diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk index 52c0624b..4681f983 100644 Binary files a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk differ diff --git a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml index e838a7ae..b5678af6 100644 --- a/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml +++ b/nwn/nwnprc/trunk/tlk/prc8_consortium.tlk.xml @@ -8349,7 +8349,7 @@ CLASS FEATURES: Level 1: Shadow Sight - Gains Darkvision and Ultravision in darkness. 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 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. @@ -18304,7 +18304,12 @@ Duration: 1 rd/lvl Additional Counter Spells: Daylight Save: Will negate or none 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. + +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. Dark Bolt (all Bolt) Dark Bolt (1 Bolt/rnd) Anti-Paladin @@ -56416,7 +56421,7 @@ REQUIREMENTS: Race: Dwarf. Alignment: Any nonevil. 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: diff --git a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk index 72e0ea3a..4681f983 100644 Binary files a/nwn/nwnprc/trunk/tlk/prc_consortium.tlk and b/nwn/nwnprc/trunk/tlk/prc_consortium.tlk differ