PRC8/trunk/scripts/prc_dj_comspider.nss

189 lines
6.9 KiB
Plaintext
Raw Normal View History

//::///////////////////////////////////////////////
//:: Command Spiders (Was Turn Undead)
//:: dj_s2_comspider.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Checks domain powers and class to determine
the proper turning abilities of the casting
character.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Nov 2, 2001
//:: Updated On: Jul 15, 2003 - Georg Zoeller
//:://////////////////////////////////////////////
//:: MODIFIED MARCH 5 2003 for Blackguards
//:: MODIFIED JULY 24 2003 for Planar Turning to include turn resistance hd
//:: Modified November 29, 2003 for Evil Cleric Rebuke/Command by Wes Baran
//:: Modified December 29, 2003 for 1.61 patch
//:: Modified January 1, 2004 by Cole Kleinschmit for use as Command Spiders
#include "prc_class_const"
#include "prc_alterations"
int CanCommand(int nClassLevel, int nTargetHD)
{
int nSlots = GetLocalInt(OBJECT_SELF, "wb_clr_comm_slots");
int nNew = nSlots+nTargetHD;
//FloatingTextStringOnCreature("The variable is " + IntToString(nSlots), OBJECT_SELF);
if(nClassLevel >= nNew)
{
return TRUE;
}
return FALSE;
}
void AddCommand(int nTargetHD)
{
int nSlots = GetLocalInt(OBJECT_SELF, "wb_clr_comm_slots");
SetLocalInt(OBJECT_SELF, "wb_clr_comm_slots", nSlots + nTargetHD);
}
void SubCommand(int nTargetHD)
{
int nSlots = GetLocalInt(OBJECT_SELF, "wb_clr_comm_slots");
SetLocalInt(OBJECT_SELF, "wb_clr_comm_slots", nSlots - nTargetHD);
}
void RebukeSpider(int nTurnLevel, int nTurnHD, int nVermin, int nClassLevel)
{
//Gets all creatures in a 20m radius around the caster and rebukes them or not. If the creatures
//HD are 1/2 or less of the nClassLevel then the creature is commanded (dominated).
int nCnt = 1;
int nHD, nRacial, nHDCount, bValid, nDamage;
nHDCount = 0;
effect eVis = EffectVisualEffect(VFX_IMP_PULSE_NEGATIVE);
effect eVisTurn = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED);
effect eDamage;
effect eTurned = EffectCutsceneParalyze();
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eLink = EffectLinkEffects(eVisTurn, eTurned);
eLink = EffectLinkEffects(eLink, eDur);
effect eDeath = SupernaturalEffect(EffectCutsceneDominated());
effect eDomin = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
effect eDeathLink = EffectLinkEffects(eDeath, eDomin);
effect eImpactVis = EffectVisualEffect(VFX_FNF_LOS_EVIL_30);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpactVis, GetLocation(OBJECT_SELF));
//Get nearest enemy within 20m (60ft)
//Why are you using GetNearest instead of GetFirstObjectInShape
// Because ability description says "gets closest first" :P
object oTarget = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC , OBJECT_SELF, nCnt);
while(GetIsObjectValid(oTarget) && nHDCount < nTurnHD && GetDistanceToObject(oTarget) <= 20.0)
{
if(!GetIsFriend(oTarget))
{
nHD = GetHitDice(oTarget) + GetTurnResistanceHD(oTarget);
nRacial = MyPRCGetRacialType(oTarget);
if(nHD <= nTurnLevel && nHD <= (nTurnHD - nHDCount))
{
//Check the various domain turning types
if(nRacial == RACIAL_TYPE_VERMIN)
{
bValid = TRUE;
//debug
SpeakString("Vermin Found");
}
//Apply results of the turn
if( bValid == TRUE)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
//if(IntToFloat(nClassLevel)/2.0 >= IntToFloat(nHD))
//{
if((nClassLevel/2) >= nHD && CanCommand(nClassLevel, nHD))
{
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD));
//Destroy the target
DelayCommand(0.1f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDeathLink, oTarget, RoundsToSeconds(nClassLevel + 5)));
//AssignCommand(oTarget, ClearAllActions());
//SetIsTemporaryFriend(oTarget, OBJECT_SELF, TRUE, RoundsToSeconds(nClassLevel + 5));
AddCommand(nHD);
DelayCommand(RoundsToSeconds(nClassLevel + 5), SubCommand(nHD));
//debug
SpeakString("Commanding Spider");
}
else
{
//Turn the target
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_TURN_UNDEAD));
//AssignCommand(oTarget, ActionMoveAwayFromObject(OBJECT_SELF, TRUE));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nClassLevel + 5));
//debug
SpeakString("Rebuking Spider");
}
nHDCount = nHDCount + nHD;
}
}
bValid = FALSE;
}
nCnt++;
oTarget = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, OBJECT_SELF, nCnt);
}
}
void main()
{
int nClericLevel = GetLevelByClass(CLASS_TYPE_JUDICATOR);
int nTotalLevel = GetHitDice(OBJECT_SELF);
int nTurnLevel = nClericLevel;
int nClassLevel = nClericLevel;
//Flags for bonus turning types
int nVermin = GetHasFeat(FEAT_PLANT_DOMAIN_POWER) + GetHasFeat(FEAT_ANIMAL_COMPANION);
//Make a turning check roll
int nChrMod = GetAbilityModifier(ABILITY_CHARISMA);
int nTurnCheck = d20() + nChrMod; //The roll to apply to the max HD of undead that can be turned --> nTurnLevel
int nTurnHD = d6(2) + nChrMod + nClassLevel; //The number of HD of undead that can be turned.
//Determine the maximum HD of the undead that can be turned.
if(nTurnCheck <= 0)
{
nTurnLevel -= 4;
}
else if(nTurnCheck >= 1 && nTurnCheck <= 3)
{
nTurnLevel -= 3;
}
else if(nTurnCheck >= 4 && nTurnCheck <= 6)
{
nTurnLevel -= 2;
}
else if(nTurnCheck >= 7 && nTurnCheck <= 9)
{
nTurnLevel -= 1;
}
else if(nTurnCheck >= 10 && nTurnCheck <= 12)
{
//Stays the same
}
else if(nTurnCheck >= 13 && nTurnCheck <= 15)
{
nTurnLevel += 1;
}
else if(nTurnCheck >= 16 && nTurnCheck <= 18)
{
nTurnLevel += 2;
}
else if(nTurnCheck >= 19 && nTurnCheck <= 21)
{
nTurnLevel += 3;
}
else if(nTurnCheck >= 22)
{
nTurnLevel += 4;
}
RebukeSpider(nTurnLevel, nTurnHD, nVermin, nClassLevel);
}