NWNDS/nwnds_module/krag_infusion.nss
Jaysyn904 de24f81734 Added NWN Dark Sun module contents
Added NWN Dark Sun module contents.
2021-07-12 21:24:46 -04:00

176 lines
6.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//::
//:: 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 krags 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));
}
}
}