2026/02/19 Update

Eldritch Disciple should have Verminlord as an epic bonus feat.
Only spellcasters can use Craft (Alchemy).
Added Great Charisma and removed Great Wisdom as Force Missile Mage epic bonus feats.
Frenzied Berserker was missing Great STR 10 as an epic bonus feat.
Oozemaster had several epic bonus feats only grantable at 10th lvl.
Pyromancer's Great Charisma bonus feats were pointing at wrong or non-existent feats.
Corrected Frenzied Berserker's skill list.
Corrected Legendary Dreadnought's skill list.
Added placeholders for Combat Form feats.
Added Combat Forms masterfeats.
Fixed ASF issue with Eldritch Sculptor's 2nd blast.
Gated debug in CheckIfDeleveled().
Updated AddRacialRestrictions() for latest races.
Vow of Poverty & Forsaker work better together at level up.
Maybe fixed the mass ability buffs not hitting all targets issue.  Needs mulitplayer testing.
Updated some creature abilities to use PRC functions.
This commit is contained in:
Jaysyn904
2026-02-19 21:10:22 -05:00
parent e8e5f457b7
commit c1188ebb28
74 changed files with 3791 additions and 3606 deletions

View File

@@ -104,7 +104,55 @@ int DoSpell(object oCaster, object oTarget, int nSpellID, int nCasterLevel, int
float fDuration = HoursToSeconds(nCasterLevel);
if(nMetaMagic & METAMAGIC_EXTEND) fDuration *= 2;
location lTarget;
if(bMass)
if(bMass)
{
location lTarget = PRCGetSpellTargetLocation();
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
if(spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
{
PRCSignalSpellEvent(oTarget, FALSE);
int nStatMod = d4() + 1;
if(nMetaMagic & METAMAGIC_MAXIMIZE) nStatMod = 5;
if(nMetaMagic & METAMAGIC_EMPOWER) nStatMod += (nStatMod / 2);
if(bVision)
{
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectLinkEffects(EffectUltravision(), eDur), oTarget, fDuration,TRUE,-1,nCasterLevel);
}
else
{
StripBuff(oTarget, nSpellID, nAltSpellID);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectLinkEffects(EffectAbilityIncrease(nAbility, nStatMod), eDur), oTarget, fDuration,TRUE,-1,nCasterLevel);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
}
else
{
// Single-target path
if(spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
{
PRCSignalSpellEvent(oTarget, FALSE);
int nStatMod = d4() + 1;
if(nMetaMagic & METAMAGIC_MAXIMIZE) nStatMod = 5;
if(nMetaMagic & METAMAGIC_EMPOWER) nStatMod += (nStatMod / 2);
if(bVision)
{
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectLinkEffects(EffectUltravision(), eDur), oTarget, fDuration,TRUE,-1,nCasterLevel);
}
else
{
StripBuff(oTarget, nSpellID, nAltSpellID);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectLinkEffects(EffectAbilityIncrease(nAbility, nStatMod), eDur), oTarget, fDuration,TRUE,-1,nCasterLevel);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}
}
/* if(bMass)
{
lTarget = PRCGetSpellTargetLocation();
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
@@ -130,7 +178,7 @@ int DoSpell(object oCaster, object oTarget, int nSpellID, int nCasterLevel, int
}
if(!bMass) break;
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
} */
return TRUE; //return TRUE if spell charges should be decremented
}

View File

@@ -5,8 +5,7 @@
//:://////////////////////////////////////////////
/*
Creature must make a ranged touch attack to hit
the intended target. Reflex or Will save is
needed to halve damage or avoid effect.
the intended target.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk

View File

@@ -5,8 +5,7 @@
//:://////////////////////////////////////////////
/*
Creature must make a ranged touch attack to hit
the intended target. Reflex or Will save is
needed to halve damage or avoid effect.
the intended target.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
@@ -37,8 +36,10 @@ void main()
//Make a saving throw check
if (PRCDoRangedTouchAttack(oTarget))
{
//Apply the VFX impact and effects
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nCount));
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
//Apply the VFX impact and effects
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nCount));
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}

View File

@@ -5,8 +5,7 @@
//:://////////////////////////////////////////////
/*
Creature must make a ranged touch attack to hit
the intended target. Fortitude save is
needed to avoid effect.
the intended target.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk

View File

@@ -5,8 +5,7 @@
//:://////////////////////////////////////////////
/*
Creature must make a ranged touch attack to hit
the intended target. Reflex or Will save is
needed to halve damage or avoid effect.
the intended target.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk

View File

@@ -5,8 +5,7 @@
//:://////////////////////////////////////////////
/*
Creature must make a ranged touch attack to hit
the intended target. Fort save is
needed to avoid effect.
the intended target.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk

View File

@@ -5,8 +5,7 @@
//:://////////////////////////////////////////////
/*
Creature must make a ranged touch attack to hit
the intended target. Reflex or Will save is
needed to halve damage or avoid effect.
the intended target.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk

View File

@@ -51,6 +51,6 @@ void main()
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eBolt, oTarget);
}
}
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLightning, oTarget, 1.8);
//SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
//SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLightning, oTarget, 1.8);
}

View File

@@ -16,28 +16,33 @@
void main()
{
//Declare major variables
object oNPC = oNPC;
object oTarget;
float fDelay;
effect eDisease;
effect eImpact = EffectVisualEffect(VFX_IMP_PULSE_NATURE);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, OBJECT_SELF);
//Get first target in spell area
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(OBJECT_SELF));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oNPC);
//Get first target in spell area
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oNPC));
while(GetIsObjectValid(oTarget))
{
if(oTarget != OBJECT_SELF)
if(oTarget != oNPC)
{
if(!GetIsReactionTypeFriendly(oTarget))
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_PULSE_DISEASE));
SignalEvent(oTarget, EventSpellCastAt(oNPC, SPELLABILITY_PULSE_DISEASE));
//Determine effect delay
fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20;
fDelay = GetDistanceBetween(oNPC, oTarget)/20;
eDisease = EffectDisease(DISEASE_SOLDIER_SHAKES);
//Apply the VFX impact and effects
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDisease, oTarget));
}
}
//Get next target in spell area
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(OBJECT_SELF));
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(oNPC));
}
}

View File

@@ -38,7 +38,7 @@ void main()
//Apply the VFX impact and effects
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDown, oTarget, RoundsToSeconds(2));
DelayCommand(0.01, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam,oTarget));
DelayCommand(0.01, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam,oTarget));
}
//Get next target in spell area
}

View File

@@ -24,7 +24,7 @@ less than 8 HD that is within 20 feet of the wall
is blinded for 2d4 rounds by the colors if it
looks at the wall.
The wall<EFBFBD>s maximum proportions are 4 feet wide per
The walls maximum proportions are 4 feet wide per
caster level and 2 feet high per caster level. A
prismatic wall spell cast to materialize in a
space occupied by a creature is disrupted, and
@@ -41,7 +41,7 @@ The wall can be destroyed, color by color, in
consecutive order, by various magical effects;
however, the first color must be brought down
before the second can be affected, and so on.
A rod of cancellation or a mage<EFBFBD>s disjunction
A rod of cancellation or a mages disjunction
spell destroys a prismatic wall, but an
antimagic field fails to penetrate it. Dispel
magic and greater dispel magic cannot dispel

View File

@@ -217,11 +217,11 @@ void DoRay(object oTarget, int nSaveDC, int nRoll, int nCasterLvl, object oPC)
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nSaveDC, SAVING_THROW_TYPE_SPELL))
{
// makes the target invisible
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget, 6.0);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget, 6.0);
// allows pathfinding through the target
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneGhost(), oTarget, 6.0);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneGhost(), oTarget, 6.0);
// paralyzes the target, ignores immunity
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneParalyze(), oTarget, 6.0);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneParalyze(), oTarget, 6.0);
// save the target location for later visual effect
location lLoc = GetLocation(oTarget);
@@ -280,7 +280,7 @@ void DoRay(object oTarget, int nSaveDC, int nRoll, int nCasterLvl, object oPC)
// Target is not a player
// To simplify against NPCs and also reward xp, applies same death as Green color
DeathlessFrenzyCheck(oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oTarget);
}
// a visual effect for banishment
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), lLoc);

View File

@@ -15,11 +15,11 @@ multicolored light that surrounds you and protects
you from all forms of attack. The sphere flashes in
all colors of the visible spectrum.
The sphere<EFBFBD>s blindness effect on creatures with less
The spheres blindness effect on creatures with less
than 8 HD lasts 2d4x10 minutes.
You can pass into and out of the prismatic sphere and
remain near it without harm. However, when you<EFBFBD>re
remain near it without harm. However, when youre
inside it, the sphere blocks any attempt to project
something through the sphere (including spells). Other
creatures that attempt to attack you or pass through
@@ -145,11 +145,11 @@ void main()
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_SPELL))
{
// makes the target invisible
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget, 6.0);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget, 6.0);
// allows pathfinding through the target
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneGhost(), oTarget, 6.0);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneGhost(), oTarget, 6.0);
// paralyzes the target, ignores immunity
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneParalyze(), oTarget, 6.0);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectCutsceneParalyze(), oTarget, 6.0);
// save the target location for later visual effect
location lLoc = GetLocation(oTarget);
@@ -208,7 +208,7 @@ void main()
// Target is not a player
// To simplify against NPCs and also reward xp, applies same death as Green color
DeathlessFrenzyCheck(oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oTarget);
}
// a visual effect for banishment
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), lLoc);

View File

@@ -353,19 +353,21 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
if (nBaseItemType == BASE_ITEM_QUARTERSTAFF && !GetIsMagicItem(oMyWeapon))
{
// Execute the code for non-magical quarterstaff here
bCondition = bCondition && TRUE; // Update the condition as needed
fDuration = TurnsToSeconds(nDuration);
}
else if (nBaseItemType == BASE_ITEM_CLUB && !GetIsMagicItem(oMyWeapon))
{
// Execute the code for non-magical club here
bCondition = bCondition && TRUE; // Update the condition as needed
fDuration = TurnsToSeconds(nDuration);
}
else
{
// Invalid weapon type
// Invalid weapon type, do nothing or handle the error here
bCondition = bCondition && FALSE; // Update the condition as needed
fDuration = 0.0; // Update the duration as needed