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

265 lines
9.2 KiB
Plaintext

#include "nw_i0_spells"
#include "x2_i0_spells"
#include "x2_inc_switches"
#include "ar_inc_defraze"
#include "divinetenser_inc"
//#include "ar_debug"
const int CONCENTRATION_DIFFICULTY = 10;
const float DISTANCE_TO_HOSTILE = 5.0;
const int SPELL_BACKLASH = 2020;
const int SPELL_CONSERVATION = 2018;
const int SPELL_STEALENERGY=2021;
const int SPELL_OBSIDIANDEATH=2022;
const int SPELL_CREATE_MAGIC_TATTOO=2243;
const string CONSERVE_SPELL_FAIL_TEXT = "Spell Failed: The land has been protected from defiling.";
const string AR_SPELL_CLASS_TEXT = "You are not of the required class to cast this spell";
// exits spell hook if nSpellID is in list
int NC_ExitIfSpell(int nSpellID);
//returns true if oPC has any levels in NClass, CLASS_TYPE_*
int NC_GetHasClass(int nCLASS, object oPC);
//Dose the preservers backlash effect on a subject defiler
// oPC: creature to effect
void DoBacklashEffect(object oPC);
//Conservation Spell Fail
//Target must make a will save in order to cast spell
void DoConservationEffect(object oPC);
//Spell Restrictions for Defiler and Preserver
int NCSpellCheck(int nSpellID, int nCasterClass);
void main()
{
object oMagicItem = GetSpellCastItem();
object oPC = OBJECT_SELF;
if(GetLocalInt(OBJECT_SELF,"tensers_transformation") &&
(GetIsObjectValid(oMagicItem) &&
GetBaseItemType(oMagicItem) == BASE_ITEM_SPELLSCROLL ||
GetBaseItemType(oMagicItem) == BASE_ITEM_RING ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MISCWIDE ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MISCTHIN ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MISCTALL ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MISCSMALL ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MISCMEDIUM ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MISCLARGE ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MAGICWAND ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MAGICSTAFF ||
GetBaseItemType(oMagicItem) == BASE_ITEM_MAGICROD ||
GetBaseItemType(oMagicItem) == BASE_ITEM_ENCHANTED_WAND ||
GetBaseItemType(oMagicItem) == BASE_ITEM_ENCHANTED_SCROLL ||
GetBaseItemType(oMagicItem) == BASE_ITEM_CLOAK ||
GetBaseItemType(oMagicItem) == BASE_ITEM_BOOTS ||
GetBaseItemType(oMagicItem) == BASE_ITEM_BOOK ||
GetBaseItemType(oMagicItem) == BASE_ITEM_AMULET ||
GetBaseItemType(oMagicItem) == BASE_ITEM_BELT ||
GetBaseItemType(oMagicItem) == BASE_ITEM_BRACER ||
GetBaseItemType(oMagicItem) == BASE_ITEM_GEM ||
GetBaseItemType(oMagicItem) == BASE_ITEM_TORCH ||
GetBaseItemType(oMagicItem) == BASE_ITEM_GLOVES))
{
DelayCommand(0.2, CheckHasTensersEffects(oPC));
DelayCommand(0.3, CheckDivinePowerEffects(oPC));
SendMessageToPC(OBJECT_SELF,"You cannot use magic or magical items while "+
"under the effects of Tenser's Transformation.");
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect
(VFX_IMP_MAGIC_RESISTANCE_USE),OBJECT_SELF);
SetModuleOverrideSpellScriptFinished();
}
//ar_debug("starting SpellHook", OBJECT_SELF);
location lCasterLocation=GetLocation(OBJECT_SELF);
int nCasterClass = GetLastSpellCastClass();
int bCanCastSpell = NCSpellCheck(GetLastSpell(),nCasterClass);
//----------------------------------------------------------------------
// Add Defiling Aura Effect, Backlash, Conservation
// For athas reborn PW
// Created By NiteCap@gmail.com
//----------------------------------------------------------------------
//if Spell was cast by pc or creature
//then we do Aura, Backlash, and conservation effects
// if Spell is cast from an item, exit
int nSpellID = GetSpellId ();
if (GetIsObjectValid(GetSpellCastItem()))
{
if(GetIsPC(oPC))
{
// firstly check that the spell is being cast from a scroll
object oScroll = GetSpellCastItem();
if(GetIsObjectValid(oScroll) && GetBaseItemType(oScroll) == BASE_ITEM_SPELLSCROLL)
{
// now check are we in combat
if(GetIsInCombat(oPC))
{
// now find the nearest hostile
object oHostile = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oPC);
if(GetIsObjectValid(oHostile))
{
// check the distance to the nearest hostile
if(GetDistanceBetween(oPC, oHostile) <= DISTANCE_TO_HOSTILE)
{
// take in to account the innate spell level of the scroll
// I am using des_crft_spells.2da Innate Level column here, not (as would be correct)
// the IPPR_Spells.2da InnateLvl column, because some of the scrolls in
// the game ( i.e. light) would not be useable (DC 30+)
int nInnateLevel = StringToInt(Get2DAString("des_crft_spells", "Level", nSpellID));
// do a concentration check
if (!GetIsSkillSuccessful(oPC, SKILL_CONCENTRATION, CONCENTRATION_DIFFICULTY + nInnateLevel))
{
SetModuleOverrideSpellScriptFinished();
}
}
}
}
}
}
return;
}
// exits spellhook if nSpellID is in list
// or if we have effects of nSpellID.
if(NC_ExitIfSpell(nSpellID)){return;}
int nSpellLevel= StringToInt(Get2DAString("spells", "Innate",nSpellID));
//NC:EDIT
//Spell Restrictions for Defiler and Preserver
if(!bCanCastSpell)
{
FloatingTextStringOnCreature(AR_SPELL_CLASS_TEXT,OBJECT_SELF,TRUE);
SetModuleOverrideSpellScriptFinished();
return;
}
//NC:EDIT
if (nCasterClass == CLASS_TYPE_SORCERER ||
nCasterClass == 43 )
{
//ar_debug("starting Aura effects", OBJECT_SELF);
//Add conservation Check
DoConservationEffect(oPC);
DoRaze(nSpellID, lCasterLocation, OBJECT_SELF);
//add check for Backlash
DoBacklashEffect(OBJECT_SELF);
}
//---------------------------------------------------------------------------------------
}
void DoBacklashEffect(object oTarget)
{
int nHasBackLash = GetLocalInt(oTarget,"BackLash");
int nDice = GetLocalInt(oTarget,"BackLashDice");
if(!NC_GetHasClass(CLASS_TYPE_SORCERER,oTarget))
{
return;
}
if(nHasBackLash==1)
{
effect eDamage = EffectDamage(d6(nDice));
effect eVis = EffectVisualEffect(VFX_IMP_PULSE_NEGATIVE);
effect eLink = EffectLinkEffects(eDamage, eVis);
object oAOE = GetLocalObject(oTarget, "BackLashAOE");
if(GetIsObjectValid(oAOE))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT,eLink,oTarget);
DeleteLocalInt(oTarget, "BackLash");
DeleteLocalInt(oTarget, "BackLashDice");
DeleteLocalObject(oTarget, "BackLashAOE");
DestroyObject(oAOE);
}
else
{
DeleteLocalInt(oTarget, "BackLash");
DeleteLocalInt(oTarget, "BackLashDice");
DeleteLocalObject(oTarget, "BackLashAOE");
}
return;
}
}
void DoConservationEffect(object oPC)
{
object oCaster = GetLocalObject(oPC,"AR_CONSERVE_CASTER");
int nDC = GetLocalInt(oPC,"AR_CONSERVE");
if(GetIsObjectValid(oCaster))
{
if(WillSave(oPC, nDC,SAVING_THROW_TYPE_SPELL, oCaster)==0)
{
FloatingTextStringOnCreature(CONSERVE_SPELL_FAIL_TEXT,oPC,FALSE);
SetModuleOverrideSpellScriptFinished();
return;
}
}
}
int NCSpellCheck(int nSpellID, int nCasterClass)
{
int nReturn=TRUE;
switch(nCasterClass)
{
case CLASS_TYPE_WIZARD:
{
if(nSpellID == SPELL_OBSIDIANDEATH)nReturn==FALSE;
if(nSpellID == SPELL_STEALENERGY)nReturn==FALSE;
}
case CLASS_TYPE_SORCERER:
{
if(nSpellID == SPELL_CONSERVATION)nReturn==FALSE;
if(nSpellID == SPELL_BACKLASH)nReturn==FALSE;
}
default: {nReturn==TRUE;}
}
return nReturn;
}
int NC_GetHasClass(int nCLASS, object oPC)
{
if (GetLevelByClass(nCLASS, oPC)>=1)
{
return TRUE;
}
else
{
return FALSE;
}
}
// exits spell hook if nSpellID is in list
int NC_ExitIfSpell(int nSpellID)
{
if((nSpellID == SPELL_BIGBYS_INTERPOSING_HAND) ||
(nSpellID == SPELL_BIGBYS_GRASPING_HAND) ||
(nSpellID == SPELL_BIGBYS_FORCEFUL_HAND) ||
(nSpellID == SPELL_BIGBYS_CRUSHING_HAND) ||
(nSpellID == SPELL_ETHEREALNESS) ||
(nSpellID == SPELL_SHADOW_CONJURATION_INIVSIBILITY) ||
(nSpellID == SPELL_INVISIBILITY) ||
(nSpellID == SPELL_CREATE_MAGIC_TATTOO) ||
(nSpellID == SPELL_INVISIBILITY_SPHERE) ||
(nSpellID == SPELL_SANCTUARY) ||
(nSpellID == SPELL_IMPROVED_INVISIBILITY))return TRUE;
return FALSE;
}