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.
81 lines
2.5 KiB
Plaintext
81 lines
2.5 KiB
Plaintext
|
|
#include "prc_inc_spells"
|
|
#include "prc_add_spell_dc"
|
|
//
|
|
// Returns TRUE if the greenfire heartbeat has fired at least once.
|
|
//
|
|
int HasHeartbeatFired()
|
|
{
|
|
return GetLocalInt(OBJECT_SELF, "SP_GREENFIRE_HBFIRED");
|
|
}
|
|
|
|
//
|
|
// Saves the fact that the greenfire heartbeat has fired.
|
|
//
|
|
void SetHeartbeatFired()
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "SP_GREENFIRE_HBFIRED", TRUE);
|
|
}
|
|
|
|
//
|
|
// Gets the greenfire spell ID.
|
|
//
|
|
int GetGreenfireSpellID()
|
|
{
|
|
return GetLocalInt(GetAreaOfEffectCreator(), "SP_GREENFIRE_SPELLID");
|
|
}
|
|
|
|
//
|
|
// Saves the specified spell ID as the greenfire spell ID.
|
|
//
|
|
void SetGreenfireSpellID(int nSpellID)
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "SP_GREENFIRE_SPELLID", nSpellID);
|
|
}
|
|
|
|
|
|
//
|
|
// Runs the greenfire spell effect against the specified target for the specified
|
|
// caster.
|
|
//
|
|
void DoGreenfire(int nDamageType, object oCaster, object oTarget)
|
|
{
|
|
// Get the spell ID for greenfire, which is stored as a local int on the caster.
|
|
int nSpellID = GetLocalInt(oCaster, "SP_GREENFIRE_SPELLID");
|
|
|
|
// Get the amount of bonus damage, based on caster level.
|
|
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
|
int nBonus = nCasterLevel;
|
|
if (nBonus > 10) nBonus = 10;
|
|
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCaster))
|
|
{
|
|
// Fire cast spell at event for the specified target
|
|
PRCSignalSpellEvent(oTarget, TRUE, nSpellID, oCaster);
|
|
|
|
int nPenetr = nCasterLevel + SPGetPenetr();
|
|
|
|
if (!PRCDoResistSpell(oCaster, oTarget,nPenetr))
|
|
{
|
|
// Roll the damage and let the target make a reflex save if the
|
|
// heartbeat hasn't fired yet, once that happens targets get no save.
|
|
int nDamage = PRCGetMetaMagicDamage(nDamageType, 2, 6, 0, nBonus);
|
|
// Acid Sheath adds +1 damage per die to acid descriptor spells
|
|
if (GetHasDescriptor(nSpellID, DESCRIPTOR_ACID) && GetHasSpellEffect(SPELL_MESTILS_ACID_SHEATH, oCaster))
|
|
nDamage += 2;
|
|
nDamage += SpellDamagePerDice(oCaster, 2);
|
|
if (!HasHeartbeatFired())
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget,
|
|
PRCGetSaveDC(oTarget,oCaster), SAVING_THROW_TYPE_ACID);
|
|
|
|
// If we really did damage apply it to the target.
|
|
if (nDamage > 0)
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT,
|
|
PRCEffectDamage(oTarget, nDamage, nDamageType), oTarget);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Test main
|
|
//void main(){}
|