PRC8_fork/nwn/nwnprc/trunk/smp/phs_s_spiritwea.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

299 lines
10 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*:://////////////////////////////////////////////
//:: Spell Name Spiritual Weapon
//:: Spell FileName PHS_S_SpiritWea
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Evocation [Force]
Level: Clr 2, War 2
Components: V, S, DF
Casting Time: 1 standard action
Range: Medium (20M)
Effect: Magic weapon of force
Duration: 1 round/level (D)
Saving Throw: None
Spell Resistance: Yes
A weapon made of pure force springs into existence and attacks opponents at
a distance, as you direct it, dealing 1d8 force damage per hit, +1 point per
three caster levels (maximum +5 at 15th level). The weapon takes the shape
of a weapon of your chosen alignment (a weapon with some spiritual
significance or symbolism to you, see below) and has the same threat range
and critical multipliers as a real weapon of its form.
It attempts to strike a single target each round. It will attack the closest
enemy to the chosen spell location, then subsiquently any nearest enemy,
until non remain. It uses your base attack bonus (possibly allowing it
multiple attacks per round in subsequent rounds) plus your Wisdom modifier
as its attack bonus. It strikes as a spell, not as a weapon, so, for example,
it can damage creatures that have damage reduction. Your feats or combat
actions do not affect the weapon. If the weapon goes beyond the spell range
or if it goes out of your sight, the weapon returns to you and hovers.
A spiritual weapon cannot be attacked or harmed by physical attacks, but
dispel magic, disintegrate, a sphere of annihilation, or a rod of
cancellation affects it. A spiritual weapons AC against touch attacks is
12 (10 + size bonus for Tiny object).
If an attacked creature has spell resistance, you make a caster level check
(1d20 + caster level) against that spell resistance the first time the
spiritual weapon strikes it. If the weapon is successfully resisted, the
spell is dispelled. If not, the weapon has its normal full effect on that
creature for the duration of the spell.
The weapon that you get is dependant upon your alignment. A neutral cleric
creates a spiritual weapon of a random alignment. The weapons associated
with each alignment are as follows.
Chaos: Battleaxe
Evil: Light flail
Good: Warhammer
Law: Longsword
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Creates a spiritual weapon invisible person.
Then, will create one of the 4 special weapon on them. This weapon, by default,
has the On Hit property for checking spell resistance on a target. It also
does magical damage of the amount specified, and does "No Combat Damage" otherwise.
Base attack bonus is done by leveling the spiritual weapon to the right BAB,
adding some for wisdom ETC.
The AI is "Attack nearest enemy with the weapon". If the spell is dispelled,
or whatever, it goes.
If it moves out of the spell range (20M), or the caster cannot see it,
it moves back to the caster.
No ranged weapons (using the default ones).
Oh, and the closest weapon is chosen. If more then 1 are appropriate, then
it will randomise it.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
const string PHS_SPIRIT_BATTLEAXE = "phs_spiritaxe";
const string PHS_SPIRIT_FLAIL = "phs_spiritflail";
const string PHS_SPIRIT_WARHAMMER = "phs_spirithammer";
const string PHS_SPIRIT_LONGSWORD = "phs_spiritsword";
// Creates and appropriate weapon for oCaster, on oSpirit, and returns it.
// Chaos: Battleaxe
// Evil: Light flail
// Good: Warhammer
// Law: Longsword
object WeaponToCreate(object oCaster, object oSpirit);
void main()
{
// Spell hook check.
if(!PHS_SpellHookCheck(PHS_SPELL_SPIRITUAL_WEAPON)) return;
// Declare major variables
object oCaster = OBJECT_SELF;
location lTarget = GetSpellTargetLocation();
int nCasterLevel = PHS_GetCasterLevel();
int nMetaMagic = PHS_GetMetaMagicFeat();
// Duration - 1 round/level
float fDuration = PHS_GetDuration(PHS_ROUNDS, nCasterLevel, nMetaMagic);
// Declare visual effects
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEUTRAL);
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3);
// Signal spell cast at
PHS_SignalSpellCastAt(oCaster, PHS_SPELL_SPIRITUAL_WEAPON, FALSE);
// Create the Spiritual Weapon.
object oSpiritualWeapon = CreateObject(OBJECT_TYPE_CREATURE, PHS_CREATURE_RESREF_SPIRITUAL_WEAPON, lTarget);
// Assign its new master, but only to the weapon itself
SetLocalObject(oSpiritualWeapon, "PHS_MASTER", oCaster);
// Add the weapon for them to use
object oWeaponCreated = WeaponToCreate(oCaster, oSpiritualWeapon);
// Add the correct damage. Does up to an extra +5. 1/3 levels
int nExtraDamage = PHS_LimitInteger(nCasterLevel/3, 5, 0);
// Add the damage to the sword
if(nExtraDamage > 0)
{
// Item property.
itemproperty IP_Damage = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_MAGICAL, IPGetDamageBonusConstantFromNumber(nExtraDamage));
// Add it.
AddItemProperty(DURATION_TYPE_PERMANENT, IP_Damage, oWeaponCreated);
}
// And add its appropriate attack bonus via using a duration effect.
int nStat;
// Check if it was cast from an item
if(GetIsObjectValid(GetSpellCastItem()))
{
// Minimum bonus stat needed to cast the spell
nStat = 2;
}
else
{
// Else normal ability
nStat = PHS_LimitInteger(PHS_GetAppropriateAbilityBonus(), 20);
}
// Apply stat bonus to attack
if(nStat > 1)
{
// Link eDur (visual) and the attack bonus
effect eAttack = EffectAttackIncrease(nStat);
effect eLink = EffectLinkEffects(eAttack, eDur);
// Apply the duration VFX with attack
PHS_ApplyDurationAndVFX(oSpiritualWeapon, eVis, eLink, fDuration);
}
else
{
// Apply the duration VFX
PHS_ApplyDurationAndVFX(oSpiritualWeapon, eVis, eDur, fDuration);
}
// Apply level up for the BAB.
int nBAB = GetBaseAttackBonus(oCaster);
if(nBAB > 1)
{
int nCnt;
int nPackage = GetCreatureStartingPackage(oSpiritualWeapon);
for(nCnt = 1; nCnt < nBAB; nCnt++)
{
// Always stop if it doesn't work.
if(LevelUpHenchman(oSpiritualWeapon, CLASS_TYPE_MAGICAL_FORCE, FALSE, nPackage) == 0)
{
// Debug
SendMessageToPC(oCaster, "Debug: Uh-oh, Spiritual weapon didn't level...");
break;
}
}
}
}
// Creates and appropriate weapon for oCaster, on oSpirit, and returns it.
// Chaos: Battleaxe
// Evil: Light flail
// Good: Warhammer
// Law: Longsword
object WeaponToCreate(object oCaster, object oSpirit)
{
object oWeapon;
string sResRef;
// Get ALIGNMENT_ constants to check
int nGoodEvil = GetAlignmentGoodEvil(oCaster);
int nLawChaos = GetAlignmentLawChaos(oCaster);
//int nLawChaosValue = Might make less random by checking good/evil/law/chaos
//int nGoodEvilValue = values for the "Lawful Good" ones.
// Check the good/evil alignments.
if(nGoodEvil == ALIGNMENT_NEUTRAL)
{
// They are "Neutral" (In good/evil)
// Check Law/Chaos
if(nLawChaos == ALIGNMENT_NEUTRAL)
{
// * If *totally* neutral, randomise between them all.
switch(Random(4))
{
case 0: { sResRef = PHS_SPIRIT_BATTLEAXE; } break;
case 1: { sResRef = PHS_SPIRIT_FLAIL; } break;
case 2: { sResRef = PHS_SPIRIT_WARHAMMER; } break;
default: { sResRef = PHS_SPIRIT_LONGSWORD; } break;
}
}
else if(nLawChaos == ALIGNMENT_LAWFUL)
{
// If Lawful Neutral, we create a Longsword
sResRef = PHS_SPIRIT_LONGSWORD;
}
else //if(nLawChaos == ALIGNMENT_CHAOTIC)
{
// If Chaotic Neutral, we create a Battleaxe
sResRef = PHS_SPIRIT_BATTLEAXE;
}
}
else if(nGoodEvil == ALIGNMENT_GOOD)
{
// They are "Good"
// Check Law/Chaos
if(nLawChaos == ALIGNMENT_NEUTRAL)
{
// If Neutral Good, create a Warhammer
sResRef = PHS_SPIRIT_WARHAMMER;
}
else if(nLawChaos == ALIGNMENT_LAWFUL)
{
// If Lawful Good, we will create either a Longsword or a Warhammer
// If more lawful then more good, we create a longsword more often.
if(d2() == 1)
{
sResRef = PHS_SPIRIT_LONGSWORD;
}
else
{
sResRef = PHS_SPIRIT_WARHAMMER;
}
}
else //if(nLawChaos == ALIGNMENT_CHAOTIC)
{
// If Chaotic Good, we create a Battleaxe or a Warhammer
if(d2() == 1)
{
sResRef = PHS_SPIRIT_BATTLEAXE;
}
else
{
sResRef = PHS_SPIRIT_WARHAMMER;
}
}
}
else if(nGoodEvil == ALIGNMENT_EVIL)
{
// They are "Evil"
// Check Law/Chaos
if(nLawChaos == ALIGNMENT_NEUTRAL)
{
// If Neutral Evil, create a Light Flail
sResRef = PHS_SPIRIT_FLAIL;
}
else if(nLawChaos == ALIGNMENT_LAWFUL)
{
// If Lawful Evil, we will create either a Longsword or a Light Flail
if(d2() == 1)
{
sResRef = PHS_SPIRIT_LONGSWORD;
}
else
{
sResRef = PHS_SPIRIT_FLAIL;
}
}
else //if(nLawChaos == ALIGNMENT_CHAOTIC)
{
// If Chaotic Evil, we create a Battleaxe or a Light Flail
if(d2() == 1)
{
sResRef = PHS_SPIRIT_BATTLEAXE;
}
else
{
sResRef = PHS_SPIRIT_FLAIL;
}
}
}
// Create oWeapon
oWeapon = CreateItemOnObject(sResRef, oSpirit, 1);
return oWeapon;
}