PRC8/nwn/nwnprc/trunk/spells/sp_comm_undead.nss
Jaysyn904 e81e395031 Added Vow of Poverty
Added Vow of Poverty, Jaebrin, Hobgoblin Warsoul & Forsaker fixes (thanks PRC5 & @Fencas).  Added iprp_matcost.2da for new materials.  Updated PRC8 Tester module.  Cohorts updated to support 8 classes. Fixed ranged disarm w/ Fighter. Updated release archive.
2024-12-26 17:37:36 -05:00

90 lines
2.8 KiB
Plaintext

#include "prc_inc_spells"
#include "prc_add_spell_dc"
void main()
{
PRCSetSchool(SPELL_SCHOOL_NECROMANCY);
// Run the spellhook.
if (!X2PreSpellCastCode()) return;
//Define vars
object oPC = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nCasterLvl = PRCGetCasterLevel(oPC);
int nDC = PRCGetSaveDC(oTarget, oPC);
effect eCharm = EffectCharmed();
effect eVis = EffectVisualEffect(VFX_IMP_DOMINATE_S);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eDom = EffectCutsceneDominated();
int nMetaMagic = PRCGetMetaMagicFeat();
float fDuration = HoursToSeconds(24 * nCasterLvl);
//Link charm and persistant VFX
//Not necessary anymore, might want to rename eLink2
// effect eLink = EffectLinkEffects(eVis, eDur);
// eLink = EffectLinkEffects(eLink, eCharm);
// eLink = SupernaturalEffect(eLink);
//Link domination and persistant VFX
effect eLink2 = EffectLinkEffects(eVis, eDom);
eLink2 = EffectLinkEffects(eLink2, eDur);
eLink2 = SupernaturalEffect(eLink2);
PRCSignalSpellEvent(oTarget, TRUE, SPELL_COMMAND_UNDEAD, oPC);
if(nMetaMagic & METAMAGIC_EXTEND)
fDuration *= 2;
object oCreatureSkin = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget);
//Undead
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
//Check Spell Resistance
if (!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
{
//Dominate mindless
if(GetAbilityScore(oTarget, ABILITY_INTELLIGENCE) < 11)
{
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink2, oTarget, fDuration);
}
else
{
// Doesn't seem to work anyway
// RemoveSpecificProperty(oCreatureSkin, ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS, IP_CONST_IMMUNITYMISC_MINDSPELLS);
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE, oPC, 1.0))
{
object oFaction = GetFirstFactionMember(oTarget, FALSE);
if (oFaction == oTarget)
oFaction = GetNextFactionMember(oTarget, FALSE);
ChangeToStandardFaction(oTarget, STANDARD_FACTION_DEFENDER);
AssignCommand(oTarget, ClearAllActions());
SetIsTemporaryFriend(oPC, oTarget, FALSE);
if(oFaction == OBJECT_INVALID)
{
DelayCommand(6.0, ChangeToStandardFaction(oTarget, STANDARD_FACTION_HOSTILE));
}
else
{
DelayCommand(fDuration, ChangeFaction(oFaction, oTarget));
}
DelayCommand(fDuration, SetIsTemporaryEnemy(oPC, oTarget, FALSE));
//Doesn't do anything anyway
//SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration);
}
}
}
}
else
FloatingTextStringOnCreature("Target isn't Undead", oPC, FALSE);
PRCSetSchool();
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS), oCreatureSkin);
}