NWNDS/nwnds_module/krag_infusion.nss

176 lines
6.5 KiB
Plaintext
Raw Normal View History

//::
//:: Fire_Infusion
//::
//:: A pnp version of the Fire Krag's elemental infusion attack.
//::
//:: Modified by: DM Heatstroke 02-07-12
//::
/*
Elemental Infusion (Su): The victim of a krag<61>s bite must make
a Fortitude save ( DC 18) or become cursed with a painful and fast-spreading
elemental transformation. The creature suffers 1d6
points of damage per round until it dies or is cured. The type of
damage varies by krag: acid damage for earth and silt; cold
damage for water; electricity damage for air and rain; and fire
damage for fire, magma, and sun. A remove curse or heal spell stops
the infusion. The save DC is Charisma-based.
*/
/*
I think those spells should be affected by this ability - duration will be decreased with every HB
SPELL_PROTECTION_FROM_ELEMENTS
SPELL_ELEMENTAL_SHIELD
SPELL_ENDURE_ELEMENTS
SPELL_ENERGY_BUFFER
SPELL_RESIST_ELEMENTS
I'm almost sure this one is checked in MySavingThrow()
FEAT_DRAGON_IMMUNE_FIRE
And I'm pretty sure creatures will die from damage, so do you really need that kill check?
*/
#include "NW_I0_SPELLS"
#include "nw_i0_plot"
int GetIsImmuneToInfusion(object oTarget, int nDamage)
{
if(nDamage == DAMAGE_TYPE_ACID)
{
return GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ACID_10, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ACID_9, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ACID_8, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ACID_7, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ACID_6, oTarget);
}
else if(nDamage == DAMAGE_TYPE_COLD)
{
return GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_COLD_10, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_COLD_9, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_COLD_8, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_COLD_7, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_COLD_6, oTarget);
}
else if(nDamage == DAMAGE_TYPE_ELECTRICAL)
{
return GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_10, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_9, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_8, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_7, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_6, oTarget);
}
else if(nDamage == DAMAGE_TYPE_FIRE)
{
return GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_FIRE_10, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_FIRE_9, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_FIRE_8, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_FIRE_7, oTarget)
|| GetHasFeat(FEAT_EPIC_ENERGY_RESISTANCE_FIRE_6, oTarget)
|| GetHasFeat(FEAT_FIRE_DOMAIN_POWER, oTarget);
}
return FALSE;
}
void DoBurn(object oCaster, object oTarget, int nDamage, int nSaveType, int nVfx)
{
if(!GetIsObjectValid(oTarget) || !GetIsObjectValid(oCaster))
return;
if(GetIsImmuneToInfusion(oTarget, nDamage))
{
DeleteLocalInt(oTarget, "krags_infusion");
return;
}
if(GetLocalInt(oTarget,"krags_infusion"))
{
// Normally Elemental Infusion can only be removed by Remove Curse or Heal, not by
// making saving throws
if(GetGameDifficulty() < GAME_DIFFICULTY_CORE_RULES && GetIsPC(oTarget))
{
if(MySavingThrow(SAVING_THROW_FORT, oTarget, 18, nSaveType))
{
DeleteLocalInt(oTarget, "krags_infusion");
SendMessageToPC(oTarget,"Recovered from Krag's Infusion.");
}
else
{
//Apply damage for this round
effect eBurn = EffectDamage(d6(), nDamage, DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eBurn, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(nVfx), oTarget);
DelayCommand(6.0f, DoBurn(oCaster, oTarget, nDamage, nSaveType, nVfx));
}
}
else//apply damage without saving throw
{
int nDam = d6();
if((GetCurrentHitPoints(oTarget) - nDam) < -9)
{
effect eHP = EffectDamage( 9999 , DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
effect eDeath = EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(nVfx), oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP,oTarget);
}
else
{
//Apply damage for this round
effect eBurn = EffectDamage(d6(), nDamage, DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eBurn, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(nVfx), oTarget);
DelayCommand(6.0f, DoBurn(oCaster, oTarget, nDamage, nSaveType, nVfx));
}
}
}
}
void main()
{
object oTarget = GetSpellTargetObject();
object oCaster = OBJECT_SELF;
string sDamage = GetLocalString(oCaster, "KragType");
int nDamage, nSaveType, nVfx;
if(sDamage == "acid")
{
nDamage = DAMAGE_TYPE_ACID;
nSaveType = SAVING_THROW_TYPE_ACID;
nVfx = VFX_IMP_ACID_S;
}
else if(sDamage == "cold")
{
nDamage = DAMAGE_TYPE_COLD;
nSaveType = SAVING_THROW_TYPE_COLD;
nVfx = VFX_IMP_FROST_S;
}
else if(sDamage == "electricity")
{
nDamage = DAMAGE_TYPE_ELECTRICAL;
nSaveType = SAVING_THROW_TYPE_ELECTRICITY;
nVfx = VFX_IMP_LIGHTNING_S;
}
else //if(sDamage == "fire")
{
nDamage = DAMAGE_TYPE_FIRE;
nSaveType = SAVING_THROW_TYPE_FIRE;
nVfx = VFX_IMP_FLAME_S;
}
if(!GetLocalInt(oTarget, "krags_infusion") && !GetIsImmuneToInfusion(oTarget, nDamage))
{
if(!MySavingThrow(SAVING_THROW_FORT, oTarget, 18, nSaveType))
{
SetLocalInt(oTarget, "krags_infusion", 1);
//Apply damage for first round
effect eBurn = EffectDamage(d6(), nDamage, DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eBurn, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(nVfx), oTarget);
//start pseudo heartbeat
DelayCommand(6.0f, DoBurn(oCaster, oTarget, nDamage, nSaveType, nVfx));
}
}
}