Added Force Missiles spell

Added Force Missiles spell. Fixed Shadowcaster Marker feat check. Updated Witchwwod step to grant immunity to Vine Mine & Spike Growth.  Updated release archive.
This commit is contained in:
Jaysyn904 2024-05-23 07:45:01 -04:00
parent 87065fd7bb
commit fb88c718bd
20 changed files with 39686 additions and 39452 deletions

BIN
Release/PRC8_20240522.7z Normal file

Binary file not shown.

View File

@ -2481,7 +2481,7 @@
2477 ResistEnergyCold **** **** **** **** **** ****
2478 ResistEnergyElec **** **** **** **** **** ****
2479 ResistEnergyAcid **** **** **** **** **** ****
2480 ResistEnergySonic **** **** **** **** **** ****
2480 SPELL_FORCE_MISSILES prc_scr_995 **** **** **** **** ****
2481 SYMBOL_OF_DEATH prc_scr_967 prc_scr_967 **** **** **** ****
2482 SYMBOL_OF_FEAR prc_scr_968 prc_scr_968 **** **** **** ****
2483 SYMBOL_OF_STUNING prc_scr_969 prc_scr_969 **** **** **** ****

View File

@ -2481,7 +2481,7 @@
2477 ResistEnergyCold **** 1 1 1 **** 0
2478 ResistEnergyElec **** 1 1 1 **** 0
2479 ResistEnergyAcid **** 1 1 1 **** 0
2480 ResistEnergySonic **** 1 1 1 **** 0
2480 SPELL_FORCE_MISSILES 995 1 0 0 4 0
2481 SYMBOL_OF_DEATH 967 1 1 0 8 0
2482 SYMBOL_OF_FEAR 968 1 1 0 6 0
2483 SYMBOL_OF_STUNING 969 1 1 0 7 0

View File

@ -996,7 +996,7 @@
992 Greater_Resistance 16790119 7 4 21000 3457 1 1 1 iss_gr_resis
993 Superior_Resistance 16790122 11 6 49500 3458 0 0 1 iss_sup_resis
994 Faerie_Fire 16793699 1 1 750 2924 0 1 1 iss_faerie_fire
995 **** **** **** **** **** **** **** **** **** ****
995 SPELL_FORCE_MISSILES 16790488 12 4 21000 2480 0 1 1 iss_X1LesMis
996 **** **** **** **** **** **** **** **** **** ****
997 **** **** **** **** **** **** **** **** **** ****
998 **** **** **** **** **** **** **** **** **** ****

View File

@ -30,3 +30,4 @@
26 Otilukes_Resilient_Sphere 16829196 V 4 3676
27 Shelgarns_Persistent_Blade 3739 V 1 534
28 Shield 57 A 1 417
29 SPELL_FORCE_MISSILES 16790488 V 4 2480

View File

@ -2481,7 +2481,7 @@
2477 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2478 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2479 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2480 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2480 SPELL_FORCE_MISSILES **** 0x00800 **** **** **** **** **** **** **** **** **** **** ****
2481 SYMBOL_OF_DEATH **** 0x00020 **** 5000 **** mc_mercury Mercury mc_phosphorus Phosphorus mc_diamonddust Diamond_Dust **** ****
2482 SYMBOL_OF_FEAR **** 0x10200 **** 1000 **** mc_mercury Mercury mc_phosphorus Phosphorus mc_diamonddust Diamond_Dust **** ****
2483 SYMBOL_OF_STUNING 0x00004 0x10000 **** 5000 **** mc_mercury Mercury mc_phosphorus Phosphorus mc_diamonddust Diamond_Dust **** ****

View File

@ -2481,7 +2481,7 @@
2477 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2478 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2479 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2480 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2480 SPELL_FORCE_MISSILES 16790488 is_X1LesMis V L vs 0x3d 0x1E sp_forcemissiles **** **** **** **** **** 4 4 1500 hand **** vco_mehancold03 **** sco_mehancold03 vs_chant_evoc_lm vs_chant_evoc_lf out 1900 **** vca_outsonic **** sca_outsonic 0 **** **** **** **** path **** 1 **** **** **** **** **** 2 **** 1 16790489 1 0 **** 1 **** **** **** 1 sphere 8.33 **** 2 **** **** **** **** **** **** **** **** **** **** **** **** ****
2481 SYMBOL_OF_DEATH 16790080 is_symb_death N S vs 0x3f 0x3E sp_symbol **** 8 **** **** **** 8 8 1500 head **** **** vco_megrdevil01 sco_megrdevil01 vs_chant_necr_hm vs_chant_necr_hf area 1000 **** **** **** **** 1 vpr_ectoevil01 homing hand spr_ectoevil01 path Death 1 **** **** **** **** **** 11 **** 1 16790082 1 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2482 SYMBOL_OF_FEAR 16790083 is_symb_fear N S vs 0x3f 0x3E sp_symbol **** 6 **** **** **** 6 6 1500 head **** **** vco_lgsprevil01 sco_lgsprevil01 vs_chant_necr_hm vs_chant_necr_hf area 1000 **** **** **** **** 1 vpr_ectoevil01 homing hand spr_ectoevil01 path Fear 1 **** **** **** **** **** 11 **** 1 16790085 1 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2483 SYMBOL_OF_STUNING 16790098 is_symb_stun E S vs 0x3f 0x3E sp_symbol **** 7 **** **** **** 7 7 1500 head **** vco_mehansonc03 **** sco_mehansonc03 vs_chant_ench_hm vs_chant_ench_hf area 1000 **** **** **** **** 1 vpr_ectomind01 homing hand spr_ectomind01 path Mind_Affecting 1 **** **** **** **** **** 11 **** 1 16790100 1 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****

View File

@ -63,7 +63,7 @@ int PerformJump(object oPC, location lLoc, int bDoKnockDown = TRUE)
bCanFly = FALSE;
// Height restriction on jumping
if (GetHeight(GetLocation(oPC), lLoc) > 20.0 && !bCanFly)
if (GetHeight(GetLocation(oPC), lLoc) > 8.0 && !bCanFly)
{
SendMessageToPC(oPC, "The target location is too high to jump to. Please pick a lower target.");
return FALSE;

View File

@ -1351,6 +1351,7 @@ const int SPELL_ETERNAL_SLEEP = 0;
const int SPELL_GREATER_BESTOW_CURSE = 0;
const int SPELL_FAERIE_FIRE = 2924;
const int SPELL_MASS_AID = 2853;
const int SPELL_FORCE_MISSILES = 2480;
const int SPELL_SYMBOL_OF_DEATH = 2481;
const int SPELL_SYMBOL_OF_FEAR = 2482;
const int SPELL_SYMBOL_OF_STUNING = 2483;

View File

@ -6,6 +6,11 @@
#include "inv_inc_invfunc"
#include "inv_invokehook"
// int SPELL_VINE_MINE_ENTANGLE = 530;
// int SPELL_VINE_MINE_HAMPER_MOVEMENT = 531;
void main()
{
@ -20,9 +25,15 @@ void main()
object oTarget = PRCGetSpellTargetObject();
effect eWeb = EffectImmunity(IMMUNITY_TYPE_ENTANGLE);
effect eVMEntagle = EffectSpellImmunity(SPELL_VINE_MINE_ENTANGLE);
effect eVMHamper = EffectSpellImmunity(SPELL_VINE_MINE_HAMPER_MOVEMENT);
effect eSpikeGrowth = EffectSpellImmunity(SPELL_SPIKE_GROWTH);
effect eVis = EffectVisualEffect(VFX_IMP_MAGIC_PROTECTION);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = EffectLinkEffects(eWeb, eDur);
eLink = EffectLinkEffects(eLink, eVMHamper);
eLink = EffectLinkEffects(eLink, eVMEntagle);
eLink = EffectLinkEffects(eLink, eSpikeGrowth);
int nDuration = CasterLvl;

Binary file not shown.

View File

@ -2372,13 +2372,15 @@ int MysticTheurgeMarkerFeats()
int totalMarkerFeats = nMysticDivine + nMysticArcane + nMysticShadow;
// Check if the character has chosen a valid combination of marker feats
if (totalMarkerFeats > 2 || (nMysticDivine > 1 && nMysticArcane > 1)) {
if ((totalMarkerFeats > 2) || (nMysticDivine > 1) || (nMysticArcane > 1) || (nMysticShadow > 1))
{
FloatingTextStringOnCreature("A Mystic Theurge may only advance two different types of spellcasting.", OBJECT_SELF, FALSE);
FloatingTextStringOnCreature("Please reselect your feats.", OBJECT_SELF, FALSE);
return TRUE;
}
if (nMysticDivine < 1 || nMysticArcane < 1 || nMysticShadow < 1) {
if (totalMarkerFeats < 2)
{
FloatingTextStringOnCreature("A Mystic Theurge must pick two spellcasting classes to advance at first level.", OBJECT_SELF, FALSE);
FloatingTextStringOnCreature("Please reselect your feats.", OBJECT_SELF, FALSE);
return TRUE;

View File

@ -4728,6 +4728,31 @@ effects, you gain a +10 resistance bonus on saving throws
(or Charisma checks, in the case of effects such as charm
person) to resist commands that would cause you to leave
your current position.</entry>
<entry id="13272" lang="en" sex="m">Force Missiles</entry>
<entry id="13273" lang="en" sex="m">Evocation [Force]
Level: Sorcerer 4, Wizard 4,
Components: V, S,
Casting Time: 1 Standard Action
Range: Medium (100 ft. + 10 ft./level)
Target: Up to four creatures, no two of which are more than 30 ft. apart
Duration: Instantaneous
Saving Throw: None
Spell Resistance: Yes
Sparking bolts of blue magic, like giant magic missiles, streak from your
outstretched hand to strike your foes and explode in sparkling bursts.
You create powerful missiles of magical force, each of which darts from your
fingertips and unerringly strikes its target, dealing 2d6 points of damage.
The missile then explodes in a burst of force that deals half this amount of
damage to any creatures adjacent to the primary target.
The missile strikes unerringly, even if the target is in melee or has anything
less than total cover or concealment. A caster cannot single out specific parts
of a creature.
You gain one missile for every four caster levels. Extra missiles distribute
themsleves amongst your enemies evenly.</entry>
<entry id="16409" lang="en" sex="m">62</entry>
<entry id="16410" lang="en" sex="m">63</entry>
<entry id="16411" lang="en" sex="m">64</entry>

View File

@ -0,0 +1,194 @@
//::///////////////////////////////////////////////
//:: Force Missiles
//:: sp_forcemissiles
//:: Copyright (c) 2022 PRC
//:://////////////////////////////////////////////
/*/
Force Missiles
(Spell Compendium, p. 98)
Evocation [Force]
Level: Sorcerer 4, Wizard 4,
Components: V, S,
Casting Time: 1 Standard Action
Range: Medium (100 ft. + 10 ft./level)
Target: Up to four creatures, no two of which are more than 30 ft. apart
Duration: Instantaneous
Saving Throw: None
Spell Resistance: Yes
Sparking bolts of blue magic, like giant magic missiles, streak from your
outstretched hand to strike your foes and explode in sparkling bursts.
You create powerful missiles of magical force, each of which darts from your
fingertips and unerringly strikes its target, dealing 2d6 points of damage.
The missile then explodes in a burst of force that deals half this amount of
damage to any creatures adjacent to the primary target.
The missile strikes unerringly, even if the target is in melee or has anything
less than total cover or concealment. A caster cannot single out specific parts
of a creature.
You gain one missile for every four caster levels. You can make more than one
missile strike a single target, if desired. However,you must designate targets
before rolling for spell resistance or damage.
/*/
//:://////////////////////////////////////////////
//:: Created By: Tsurani Nevericy
//:: Created On: 05/15/2024
//:://////////////////////////////////////////////
//:: Last Updated By: Tsurani Nevericy
//:: Last Updated On: 05/15/2024
//:://////////////////////////////////////////////
#include "prc_sp_func"
#include "prc_inc_spells"
#include "x2_inc_spellhook"
void SendMissileBomb(object oCaster, object oTarget, float fDelay=0.0, float fTime=0.0)
{
int nMetaMagic = PRCGetMetaMagicFeat();
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_MIRV), oTarget);
location lLoc = GetLocation(oTarget);
object oLoop = GetFirstObjectInShape(SHAPE_SPHERE, 5.0, lLoc, TRUE);
while (GetIsObjectValid(oLoop))
{
SignalEvent(oLoop, EventSpellCastAt(oCaster, PRCGetSpellId()));
if (oLoop == oTarget)
{
int nDam = d6(2);
if (nMetaMagic == METAMAGIC_MAXIMIZE)
nDam = 12;
if (nMetaMagic == METAMAGIC_EMPOWER)
nDam += nDam/2;
DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDam, DAMAGE_TYPE_MAGICAL), oLoop));
DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_MAGBLUE, FALSE, 4.0f), oLoop));
}
else if (!PRCDoResistSpell(oCaster, oLoop, FloatToInt(fDelay)))
{
int nDam = d6(1);
if (nMetaMagic == METAMAGIC_MAXIMIZE)
nDam = 6;
if (nMetaMagic == METAMAGIC_EMPOWER)
nDam += nDam/2;
DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDam, DAMAGE_TYPE_MAGICAL), oLoop));
DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_MAGBLUE), oLoop));
}
oLoop = GetNextObjectInShape(SHAPE_SPHERE, 5.0, lLoc, TRUE);
}
}
//Implements the spell impact, put code here
// if called in many places, return TRUE if
// stored charges should be decreased
// eg. touch attack hits
//
// Variables passed may be changed if necessary
int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
{
int nMetaMagic = PRCGetMetaMagicFeat();
int nSaveDC = PRCGetSaveDC(oTarget, oCaster);
int nPenetr = nCasterLevel + SPGetPenetr();
int i;
int nTargets;
int nCnt = 1;
float fDist, fDelay, fDelay2, fTime;
if (nCasterLevel > 40) nCasterLevel = 40;
int nMissiles = nCasterLevel/4;
if (nMissiles < 1) nMissiles = 1;
location lTarget = PRCGetSpellTargetLocation();
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 9.144, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget))
{
if (spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oCaster) && oTarget != oCaster)
{
nTargets++;
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, 9.144, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
if (!nTargets)
return FALSE;
int nExtraMissiles = nMissiles / nTargets;
if (nExtraMissiles <= 0)
nExtraMissiles = 1;
int nRemainder = 0;
if (nTargets > nMissiles) nTargets = nMissiles;
nRemainder = nMissiles % nTargets;
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 9.144, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget) && nCnt <= nTargets)
{
if (spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oCaster) && oTarget != oCaster)
{
if (!PRCDoResistSpell(oCaster, oTarget, FloatToInt(fDelay)))
{
int i;
for (i=1; i <= nExtraMissiles + nRemainder; i++)
{
fDist = GetDistanceBetween(oCaster, oTarget);
fDelay = fDist/(3.0 * log(fDist) + 2.0);
fTime = fDelay;
fDelay2 += 0.1;
fTime += fDelay2;
DelayCommand(fDelay2, SendMissileBomb(oCaster, oTarget, fDelay, fTime));
}
}
else
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_MIRV), oTarget);
}
nCnt++;
nRemainder = 0;
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, 9.144, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}
return TRUE;
}
void main()
{
object oCaster = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nCasterLevel = PRCGetCasterLevel(oCaster);
int i;
int nTargets;
int nCnt = 1;
float fDist, fDelay, fDelay2, fTime;
PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
if (!X2PreSpellCastCode()) return;
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags
if(!nEvent) //normal cast
{
if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
{ //holding the charge, casting spell on self
SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges
return;
}
DoSpell(oCaster, oTarget, nCasterLevel, nEvent);
}
else
{
if(nEvent & PRC_SPELL_EVENT_ATTACK)
{
if(DoSpell(oCaster, oTarget, nCasterLevel, nEvent))
DecrementSpellCharges(oCaster);
}
}
PRCSetSchool();
}
//::///////////////////////////////////////////////////////////////////