2026/04/25 Update

White Raven Hammer now has the correct description.
Fixed Skulk non-detection DC for scrying.  (Scrying is still broken)
Removed heal VFX from scrying.
Updated PRC8 version number.
Added scry DC variable to Claritangent Hand.
Glitterdust now obeys Mastery of Shaping.
Recitation now follows PnP.
Recitation's TLK entry was corrected.
Sleet Storm now obeys Mastery of Shaping.
This commit is contained in:
Jaysyn904
2026-04-25 09:02:49 -04:00
parent 6faae2799f
commit 5d111437e0
11 changed files with 191 additions and 90 deletions

View File

@@ -27,32 +27,37 @@ void main()
{
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
PRCSignalSpellEvent(oTarget);
// Mastery of shapes check
if(!CheckMasteryOfShapes(OBJECT_SELF, oTarget))
{
PRCSignalSpellEvent(oTarget);
// Apply impact vfx.
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT,
EffectVisualEffect(VFX_IMP_SPARKS), oTarget));
// Apply impact vfx.
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT,
EffectVisualEffect(VFX_IMP_SPARKS), oTarget));
// Creatures take the hide penalty whether they save or not.
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHidePenalty, oTarget, fDuration,TRUE,-1,nCasterLvl);
// Creatures take the hide penalty whether they save or not.
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHidePenalty, oTarget, fDuration,TRUE,-1,nCasterLvl);
// Creatures that are invisible become visible whether they save or not. We do
// this by looping through all the creature's effects looking for invisibility
// effects and removing them.
effect eTarget = GetFirstEffect(oTarget);
while (GetIsEffectValid(eTarget))
{
int nType = GetEffectType(eTarget);
if (EFFECT_TYPE_INVISIBILITY == nType || EFFECT_TYPE_IMPROVEDINVISIBILITY == nType)
RemoveEffect (oTarget, eTarget);
// Creatures that are invisible become visible whether they save or not. We do
// this by looping through all the creature's effects looking for invisibility
// effects and removing them.
effect eTarget = GetFirstEffect(oTarget);
while (GetIsEffectValid(eTarget))
{
int nType = GetEffectType(eTarget);
if (EFFECT_TYPE_INVISIBILITY == nType || EFFECT_TYPE_IMPROVEDINVISIBILITY == nType)
RemoveEffect (oTarget, eTarget);
eTarget = GetNextEffect(oTarget);
}
eTarget = GetNextEffect(oTarget);
}
// Let the creature make a will save, if it fails it's blinded.
if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget,OBJECT_SELF)))
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlindness, oTarget, fDuration,TRUE,-1,nCasterLvl);
}
// Let the creature make a will save, if it fails it's blinded.
if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget,OBJECT_SELF)))
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlindness, oTarget, fDuration,TRUE,-1,nCasterLvl);
}
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lTarget);
}

View File

@@ -1,6 +1,90 @@
#include "prc_inc_spells"
/*
Recitation Impact Script
Spell Compendium version:
- Conjuration (Creation)
- Level: Cleric 4, Purification 3
- Target: All allies within 60-ft. radius burst
- Duration: 1 round/level
- Allies gain +2 luck bonus to AC, attack rolls, saving throws
- +3 luck bonus if they worship same deity as caster
*/
#include "prc_inc_spells"
#include "prc_sp_func"
#include "prc_inc_combat"
//Implements the spell impact
int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
{
int nMetaMagic = PRCGetMetaMagicFeat();
float fDuration = RoundsToSeconds(nCasterLevel);
// Apply metamagic
if(nMetaMagic & METAMAGIC_EXTEND)
fDuration *= 2.0;
// Get caster's deity for comparison
string sCasterDeity = GetDeity(oCaster);
// Check if target is an ally
if(spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
{
// Determine bonus amount based on deity
int nBonus = 2;
if(GetDeity(oTarget) == sCasterDeity && sCasterDeity != "")
nBonus = 3;
// Create luck bonus effects
effect eAC = EffectACIncrease(nBonus, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL);
eAC = EffectLinkEffects(eAC, EffectVisualEffect(VFX_DUR_PROTECTION_GOOD_MINOR));
effect eAttack = EffectAttackIncrease(nBonus);
effect eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, nBonus);
// Link all effects together
effect eLink = EffectLinkEffects(eAC, eAttack);
eLink = EffectLinkEffects(eLink, eSave);
// Apply the effects
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE);
// Apply visual effect
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEAD_HOLY), oTarget);
}
return TRUE; // Return TRUE for area spells
}
void main()
{
object oCaster = OBJECT_SELF;
int nCasterLevel = PRCGetCasterLevel(oCaster);
int nSpellID = PRCGetSpellId();
PRCSetSchool(GetSpellSchool(nSpellID));
if (!X2PreSpellCastCode()) return;
// Get spell target location for area effect
location lTarget = GetSpellTargetLocation();
// Apply area of effect - 60ft radius (RADIUS_SIZE_COLOSSAL)
effect eImpact = EffectVisualEffect(VFX_FNF_LOS_HOLY_30);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, lTarget);
// Get all creatures in 60ft radius
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
DoSpell(oCaster, oTarget, nCasterLevel, 0);
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
PRCSetSchool();
}
void main()
/* void main()
{
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
if (!X2PreSpellCastCode()) return;
@@ -70,3 +154,4 @@ void main()
PRCSetSchool();
}
*/

View File

@@ -5,26 +5,26 @@
/**@file Sleet Storm
Conjuration (Creation) [Cold]
Level: Drd 3, Sor/Wiz 3
Components: V, S, M/DF
Casting Time: 1 standard action
Range: Long (400 ft. + 40 ft./level)
Area: Cylinder (40-ft. radius, 20 ft. high)
Duration: 1 round/level
Saving Throw: None
Level: Drd 3, Sor/Wiz 3
Components: V, S, M/DF
Casting Time: 1 standard action
Range: Long (400 ft. + 40 ft./level)
Area: Cylinder (40-ft. radius, 20 ft. high)
Duration: 1 round/level
Saving Throw: None
Spell Resistance: No
Driving sleet blocks all sight (even darkvision)
Driving sleet blocks all sight (even darkvision)
within it and causes the ground in the area to be
icy. A creature can walk within or through the
area of sleet at half normal speed with a DC 10
Balance check. Failure means it can<EFBFBD>t move in that
round, while failure by 5 or more means it falls
icy. A creature can walk within or through the
area of sleet at half normal speed with a DC 10
Balance check. Failure means it can't move in that
round, while failure by 5 or more means it falls
(see the Balance skill for details).
The sleet extinguishes torches and small fires.
Arcane Material Component: A pinch of dust and a
Arcane Material Component: A pinch of dust and a
few drops of water.
Author: Tenjac
@@ -42,6 +42,13 @@ void main()
object oPC = GetAreaOfEffectCreator();
object oTarget = GetEnteringObject();
int nCasterLvl = PRCGetCasterLevel(oPC);
if(CheckMasteryOfShapes(oPC, oTarget))
{
PRCSetSchool();
return;
}
effect eLink = EffectLinkEffects(EffectBlindness(), EffectMovementSpeedDecrease(50));
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget, 0.0f, TRUE, SPELL_SLEET_STORM, nCasterLvl);

View File

@@ -1,4 +1,4 @@
//::///////////////////////////////////////////////
//::///////////////////////////////////////////////
//:: Name Sleet Storm Heartbeat
//:: FileName sp_sleet_stormC.nss
//:://////////////////////////////////////////////
@@ -18,7 +18,7 @@ Driving sleet blocks all sight (even darkvision)
within it and causes the ground in the area to be
icy. A creature can walk within or through the
area of sleet at half normal speed with a DC 10
Balance check. Failure means it can<EFBFBD>t move in that
Balance check. Failure means it cant move in that
round, while failure by 5 or more means it falls
(see the Balance skill for details).
@@ -46,6 +46,13 @@ void main()
while(GetIsObjectValid(oTarget))
{
if(CheckMasteryOfShapes(GetAreaOfEffectCreator(), oTarget))
{
// Target is protected by Mastery of Shaping.
oTarget = GetNextInPersistentObject(OBJECT_SELF, OBJECT_TYPE_CREATURE);
continue;
}
int nFail = BalanceCheckFailure(oTarget);
//Can't move
@@ -60,23 +67,23 @@ void main()
PRCSetSchool();
}
int BalanceCheckFailure(object oTarget)
{
int nResult = 0;
int nRoll = GetAbilityModifier(ABILITY_DEXTERITY, oTarget) + d20(1);
int nTumble = GetSkillRank(SKILL_TUMBLE, oTarget);
//if 5 or more ranks of Tumble, +2 bonus
if(nTumble > 4) nRoll += 2;
//All fails
if(nRoll < 10)
{
//if failed by 5 or more
if((10 - nRoll) < 6) nResult = 2;
//otherwise it failed by less than 5
else nResult = 1;
}
return nResult;
}
int BalanceCheckFailure(object oTarget)
{
int nResult = 0;
int nRoll = GetSkillRank(SKILL_BALANCE, oTarget) + d20(1);
int nTumble = GetSkillRank(SKILL_TUMBLE, oTarget);
//if 5 or more ranks of Tumble, +2 bonus
if(nTumble > 4) nRoll += 2;
//All fails
if(nRoll < 10)
{
//if failed by 5 or more
if((10 - nRoll) < 6) nResult = 2;
//otherwise it failed by less than 5
else nResult = 1;
}
return nResult;
}