PRC8/Notes/future spells/sp_mass_regen.nss

102 lines
3.3 KiB
Plaintext
Raw Normal View History

//::///////////////////////////////////////////////
//:: Regenerate Ring / Circle
//:: sp_regen_ring_circle.nss
//:: Jaysyn - PRC8 2025-08-01
//::
//:: Group fast healing aura spells
//::///////////////////////////////////////////////
#include "prc_inc_spells"
void main()
{
if (!X2PreSpellCastCode()) return;
PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
object oCaster = OBJECT_SELF;
int nSpellId = PRCGetSpellId();
int nMetamagic = PRCGetMetaMagicFeat();
int nCasterLevel = PRCGetCasterLevel(oCaster);
int nDuration = 10 + (nCasterLevel / 2);
int nMaxTargets = nCasterLevel / 2;
float fMaxDistance = 30.0;
int nRegenRate = 1;
if (nSpellId == 9999)
{
nRegenRate = 3;
}
if (nMetamagic == METAMAGIC_EXTEND)
{
nDuration *= 2;
}
location lCaster = GetLocation(oCaster);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fMaxDistance, lCaster, FALSE, OBJECT_TYPE_CREATURE);
int nCount = 0;
while (GetIsObjectValid(oTarget) && nCount < nMaxTargets)
{
if (!GetIsEnemy(oCaster, oTarget) &&
GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD &&
GetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT)
{
int nCurrentHP = GetCurrentHitPoints(oTarget);
int nInitialHP = GetLocalInt(oTarget, "INITIAL_HIT_POINTS");
if (nCurrentHP > nInitialHP)
{
nInitialHP = nCurrentHP;
SetLocalInt(oTarget, "INITIAL_HIT_POINTS", nInitialHP);
}
int nCurrentRegen = GetLocalInt(oTarget, "REGEN_RATE");
int nExistingDuration = 0;
int bSameSpell = FALSE;
effect e = GetFirstEffect(oTarget);
while (GetIsEffectValid(e))
{
if (GetEffectTag(e) == "REGEN_WOUNDS")
{
if (nCurrentRegen == nRegenRate)
{
bSameSpell = TRUE;
nExistingDuration = GetEffectDurationRemaining(e) / 6;
if (nRegenRate >= nCurrentRegen) RemoveEffect(oTarget, e);
else return;
}
else if (nRegenRate >= nCurrentRegen)
{
RemoveEffect(oTarget, e);
}
}
e = GetNextEffect(oTarget);
}
if (bSameSpell)
{
nDuration += nExistingDuration;
}
SetLocalInt(oTarget, "REGEN_RATE", nRegenRate);
SetLocalInt(oTarget, "REGEN_WOUNDS_REMAINING", nDuration);
effect eVis = EffectVisualEffect(1330/* VFX_DUR_BF_IOUN_STONE_GREEN */);
effect eRegen = EffectRunScript("rs_regen_wounds", "rs_regen_wounds", "rs_regen_wounds", 6.0f, IntToString(nRegenRate));
eRegen = SetEffectSpellId(eRegen, nSpellId);
eRegen = EffectLinkEffects(eVis, eRegen);
eRegen = TagEffect(eRegen, "REGEN_WOUNDS");
PRCRemoveEffectsFromSpell(oTarget, nSpellId);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRegen, oTarget, RoundsToSeconds(nDuration));
nCount++;
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fMaxDistance, lCaster, FALSE, OBJECT_TYPE_CREATURE);
}
PRCSetSchool();
}