PRC8/nwn/nwnprc/trunk/newspellbook/tob_ssn_touchss.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

144 lines
5.2 KiB
Plaintext

/*
----------------
Touch of the Shadow Sun
tob_ssn_touchss.nss
----------------
18 MAR 09 by GC
*/ /** @file
*/
#include "tob_inc_move"
#include "tob_movehook"
////#include "prc_alterations"
#include "prc_inc_sp_tch"
#include "prc_inc_unarmed"
int UnarmedDamageRoll(int nDamageProp)
{
int nDie = StringToInt(Get2DACache("iprp_monstcost", "Die", nDamageProp));
int nNum = StringToInt(Get2DACache("iprp_monstcost", "NumDice", nDamageProp));
int nRoll;
//Potential die options
if(nDie == 4) nRoll = d4(nNum);
else if(nDie == 6) nRoll = d6(nNum);
else if(nDie == 8) nRoll = d8(nNum);
else if(nDie == 10) nRoll = d10(nNum);
else if(nDie == 12) nRoll = d12(nNum);
else if(nDie == 20) nRoll = d20(nNum);
return nRoll;
}
void main()
{
if (!PreManeuverCastCode())
{
// If code within the PreManeuverCastCode (i.e. UMD) reports FALSE, do not run this spell
return;
}
// End of Spell Cast Hook
object oInitiator = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct maneuver move = EvaluateManeuver(oInitiator, oTarget, TRUE);
int nDamage;
effect eLink;
effect ePos = EffectVisualEffect(VFX_IMP_HEALING_L);
effect eNeg = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
if(move.bCanManeuver)
{
if(GetLocalInt(oInitiator, "SSN_TOUCH_LIGHT"))
{// Must do light touch this round
// Get damage from last negative attack
nDamage = GetLocalInt(oInitiator, "SSN_TOUCH_DMG");
if(GetIsEnemy(oTarget, oInitiator))
{// Must take touch attack
int nAttackRoll = PRCDoMeleeTouchAttack(oTarget, TRUE, oInitiator);
if(nAttackRoll > 0)
{// Need to hit
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD
|| (GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)
|| GetLocalInt(oTarget, "AcererakHealing"))
{
ApplyTouchAttackDamage(oInitiator, oTarget, 1, nDamage, DAMAGE_TYPE_POSITIVE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
else
{
eLink = EffectLinkEffects(ePos, EffectHeal(nDamage));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
}
else return; // Need to discharge energy to use other ability ..keep trying
}
else
{// No need to do touch attack
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD
|| (GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD))
{
eLink = EffectLinkEffects(eNeg, EffectDamage(nDamage, DAMAGE_TYPE_POSITIVE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
else
{
eLink = EffectLinkEffects(ePos, EffectHeal(nDamage));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
}
// Set dark touch next time used
DeleteLocalInt(oInitiator, "SSN_TOUCH_LIGHT");
}
else
{// Must do dark touch this round
// Get damage
nDamage = FindUnarmedDamage(oInitiator);
nDamage = UnarmedDamageRoll(nDamage);
FloatingTextStringOnCreature("nDamage before Wisdom: "+IntToString(nDamage),OBJECT_SELF, FALSE);
nDamage += GetAbilityModifier(ABILITY_WISDOM, oInitiator);
FloatingTextStringOnCreature("nDamage after Wisdom: "+IntToString(nDamage),OBJECT_SELF, FALSE);
SetLocalInt(oInitiator, "SSN_TOUCH_DMG", nDamage);
//eLink = EffectLinkEffects(eLink, GetAttackDamage(oTarget, oInitiator, OBJECT_INVALID, GetWeaponBonusDamage(OBJECT_INVALID, oTarget), GetMagicalBonusDamage(oTarget)));
if(GetIsEnemy(oTarget, oInitiator))
{// Must take touch attack
int nAttackRoll = PRCDoMeleeTouchAttack(oTarget, TRUE, oInitiator);
if(nAttackRoll > 0)// Need to hit
{
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD
|| (GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD))
{
eLink = EffectLinkEffects(ePos, EffectHeal(nDamage));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
else
{
ApplyTouchAttackDamage(oInitiator, oTarget, 1, nDamage, DAMAGE_TYPE_NEGATIVE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eNeg, oTarget);
}
}
else return; // Need to discharge energy to use other ability ..keep trying
}
else
{// No need to do touch attack
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD
|| (GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD))
{
eLink = EffectLinkEffects(ePos, EffectHeal(nDamage));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
else
{
eLink = EffectLinkEffects(eNeg, EffectDamage(nDamage, DAMAGE_TYPE_NEGATIVE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
}
// Set light touch next time used
SetLocalInt(oInitiator, "SSN_TOUCH_LIGHT", TRUE);
}
}
}