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.
129 lines
5.1 KiB
Plaintext
129 lines
5.1 KiB
Plaintext
/**
|
|
* @file
|
|
* Spellscript for Crimson Ruination SLAs
|
|
*
|
|
*/
|
|
|
|
#include "prc_inc_template"
|
|
|
|
int PRCCanCreatureBeDestroyed(object oTarget)
|
|
{
|
|
if (!GetPlotFlag(oTarget) && !GetImmortal(oTarget))
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
int nCasterLevel, nDC, nSpell, nUses;
|
|
int nSLA = GetSpellId();
|
|
effect eNone;
|
|
|
|
object oWOL = GetItemPossessedBy(oPC, "WOL_Sunsword");
|
|
|
|
// You get nothing if you aren't wielding the weapon
|
|
if(oWOL != GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC)) return;
|
|
|
|
switch(nSLA){
|
|
case WOL_SUNSWORD_DAY:
|
|
{
|
|
nCasterLevel = GetHitDice(oPC);
|
|
nSpell = SPELL_DAYLIGHT;
|
|
nUses = 1;
|
|
if (GetHitDice(oPC) >= 16 && GetHasFeat(FEAT_LESSER_LEGACY, oPC)) nUses = 999;
|
|
break;
|
|
}
|
|
case WOL_SUNSWORD_WARD:
|
|
{
|
|
nCasterLevel = 11;
|
|
nSpell = SPELL_DEATH_WARD;
|
|
nUses = 1;
|
|
break;
|
|
}
|
|
case WOL_SUNSWORD_BANISH:
|
|
{
|
|
nCasterLevel = GetHitDice(oPC);
|
|
nUses = 1;
|
|
nDC = 20;
|
|
if (17 + GetAbilityModifier(ABILITY_CHARISMA, oPC) > nDC)
|
|
nDC = 17 + GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
location lTarget = GetLocation(oPC);
|
|
// * the pool is the number of hit dice of creatures that can be banished
|
|
int nPool = 2 * nCasterLevel;
|
|
|
|
effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
|
effect eImpact = EffectVisualEffect(VFX_FNF_LOS_EVIL_30);
|
|
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, lTarget);
|
|
|
|
//Get the first object in the are of effect
|
|
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
// * Is the creature a summoned associate
|
|
// * or is the creature an outsider
|
|
// * and is there enough points in the pool
|
|
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD && nPool > 0)
|
|
{
|
|
// * March 2003. Added a check so that 'friendlies' will not be
|
|
// * unsummoned.
|
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oPC))
|
|
{
|
|
SignalEvent(oTarget, EventSpellCastAt(oPC, SPELL_BANISHMENT));
|
|
|
|
// * Must be enough points in the pool to destroy target
|
|
if (nPool >= GetHitDice(oTarget))
|
|
{
|
|
// * Make SR and will save checks
|
|
if (!PRCDoResistSpell(oPC, oTarget, nCasterLevel) && !PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC))
|
|
{
|
|
nPool = nPool - GetHitDice(oTarget);
|
|
DeathlessFrenzyCheck(oTarget);
|
|
//Apply the VFX and delay the destruction of the summoned monster so
|
|
//that the script and VFX can play.
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oTarget));
|
|
if(PRCCanCreatureBeDestroyed(oTarget))
|
|
{
|
|
//bugfix: Simply destroying the object won't fire it's OnDeath script.
|
|
//Which is bad when you have plot-specific things being done in that
|
|
//OnDeath script... so lets kill it.
|
|
effect eKill = PRCEffectDamage(oTarget, GetCurrentHitPoints(oTarget));
|
|
//just to be extra-sure... :)
|
|
effect eDeath = EffectDeath(FALSE, FALSE);
|
|
DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eKill, oTarget));
|
|
DelayCommand(0.25, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
|
|
}
|
|
}
|
|
}
|
|
} // rep check
|
|
}
|
|
//Get next creature in the shape.
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
break;
|
|
}
|
|
case WOL_SUNSWORD_UNDEATH:
|
|
{
|
|
nCasterLevel = 20;
|
|
nSpell = SPELL_UNDEATH_TO_DEATH;
|
|
nUses = 1;
|
|
nDC = 20;
|
|
if (17 + GetAbilityModifier(ABILITY_CHARISMA, oPC) > nDC)
|
|
nDC = 17 + GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Check uses per day
|
|
if (GetLegacyUses(oPC, nSLA) >= nUses)
|
|
{
|
|
FloatingTextStringOnCreature("You have used " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " the maximum amount of times today.", oPC, FALSE);
|
|
return;
|
|
}
|
|
SetLegacyUses(oPC, nSLA);
|
|
FloatingTextStringOnCreature("You have "+IntToString(nUses - GetLegacyUses(oPC, nSLA))+ " uses of " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " remaining today.", oPC, FALSE);
|
|
if (nSpell > 0)
|
|
DoRacialSLA(nSpell, nCasterLevel, nDC);
|
|
}
|
|
|