Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
299 lines
10 KiB
Plaintext
299 lines
10 KiB
Plaintext
/*:://////////////////////////////////////////////
|
||
//:: 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 weapon’s 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;
|
||
}
|