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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 wall’s 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 mage’s disjunction
|
||||
spell destroys a prismatic wall, but an
|
||||
antimagic field fails to penetrate it. Dispel
|
||||
magic and greater dispel magic cannot dispel
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 sphere’s 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 you’re
|
||||
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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user