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