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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
*/
|
||||
@@ -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);
|
||||
|
||||
@@ -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 can’t 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user