//////////////////////////////////////////////////////////////////////////////// // // Olander's AI // oai_inc_base // by Don Anderson // dandersonru@msn.com // // Main AI Include File // //////////////////////////////////////////////////////////////////////////////// #include "oai_inc_constant" #include "oai_inc_eqweapon" #include "oai_modprops_inc" #include "oai_dice_inc" #include "x0_i0_henchman" #include "x2_inc_itemprop" /* //For NESS Users #include "spawn_functions" #include "spawn_cfg_flag" */ /* NOTE: "nw_i0_generic" "x0_inc_generic" are included through x0_i0_henchman DO NOT INCLUDE here! */ /******************************************************************************/ //: FUNCTION DEFINITIONS //Sets up the Status of a said condition void SetStatusCondition(int nCondition, int bValid = TRUE); //Gets the Status of a said condition int GetStatusCondition(int nCondition, object oWho = OBJECT_SELF); //Sets a Battle Condition void SetBattleCondition(int nCondition, int bValid = TRUE, object oWho = OBJECT_SELF); //Gets a Battle Condition int GetBattleCondition(int nCondition, object oWho = OBJECT_SELF); //Returns TRUE if this Creature has any levels as Cleric or Druid int OAI_GetIsDivineCaster(object oCreature); //Returns TRUE if this Creature has any Bard/Wizard/Sorcerer levels int OAI_GetIsArcane(object oCreature); //Removes Specific Effects void OAI_RemoveEffects(object oTarget = OBJECT_SELF,object oFrom = OBJECT_INVALID, int nType = -1,int nSubType = -1,int nDurationType = -1,int nSpellId = -1); //Checks to See if the Same Faction or an Alliance is a Hostile Actor int OAI_GetIsAlly(object oTarget); // Determine our target for the next combat round. // Normally, this will be the same target as the last round. object OAI_AcquireTarget(); //Determines a particular Class Position is a Spell Caster //Used internally OAI_CanCastSpells int OAI_ClassIsSpellCaster(int nPos,object oNPC); //Returns whether a creature is capable of casting spells int OAI_CanCastSpells(object oNPC); //Counts up Enemies void OAI_SetCounts(); //Gets the Area Width for any Area int GetAreaWidth(object oArea); //Gets the Area Height for any Area int GetAreaHeight(object oArea); //Gets a Random Location in any Area location RandomLocation(object oArea,int nAir = 1); // dk: 10-Dec-2005 Hacked in AI status checking from Jasperre (Thanks Jasperre =) ) // This reports the AI toggle of oTarget. // * If the AI is OFF, it is TRUE. // * Returns Dead + Commandable + AI Off integers int GetAIOff(object oTarget = OBJECT_SELF); // Sets the AI to NOT use any hearbeat/perception scripts void SetAIOff(object oTarget = OBJECT_SELF); // Resets the AI off integer, so the AI scripts run. void SetAIOn(object oTarget = OBJECT_SELF); /******************************************************************************/ //: HENCHMAN FUNCTIONS (Most By Bioware from x0_inc_henai Integrated for OAI) // ~ Behavior Constants const int BK_HEALINMELEE = 10; const int BK_CURRENT_AI_MODE = 20; // Can only be in one AI mode at a time const int BK_AI_MODE_FOLLOW = 9; // default mode, moving after the player const int BK_AI_MODE_RUN_AWAY = 19; // something is causing AI to retreat const int BK_NEVERFIGHT = 30; // ~ Distance Constants const float BK_HEALTHRESHOLD = 5.0; const float BK_FOLLOW_THRESHOLD= 15.0; // difficulty difference at which familiar will flee int BK_FAMILIAR_COWARD = 7; // * Sets up special additional listening patterns // * for associates. void bkSetListeningPatterns(); // * Attempt to disarm given trap // * (called from RespondToShout and heartbeat) int bkAttemptToDisarmTrap(object oTrap, int bWasShout = FALSE); // * Attempt to open a given locked object. int bkAttemptToOpenLock(object oLocked); // Manually pick the nearest locked object int bkManualPickNearestLock(); // * Attempt to heal self then master int bkCombatAttemptHeal(); // * Attempts to follow master if outside range int bkCombatFollowMaster(); // * set behavior used by AI void bkSetBehavior(int nBehavior, int nValue); // * get behavior used by AI int bkGetBehavior(int nBehavior); // TRUE if target in the line of sight of the seer. int bkGetIsInLineOfSight(object oTarget, object oSeer=OBJECT_SELF); // Get the cosine of the angle between two objects. float bkGetCosAngleBetween(object Loc1, object Loc2); // * TRUE if the target door is in line of sight. int bkGetIsDoorInLineOfSight(object oTarget); // * called from state scripts (nw_g0_charm) to signal // * to other party members to help me out void SendForHelp(); // Register a spawn waypoint with NESS (by Celeborn) void OAI_SetSpawn(object oSpawn); //Delete (unregister) a spawn waypoint from NESS (by Celeborn) void OAI_RemoveSpawn(object oSpawn); //Create NESS Hench Spawn at Old Location void OAI_HenchSpawn(location lLoc, string sResRef); //Movement Penalties Associated With Henchman Equipped Armor void EquipHenchArmor(object oHench, object oArmor); //Use this Function to Store Your Henchman Persistently /* NOTE: To allow manual deletion of a player DB the DB Naming is set up for the 1st 4 Characters of the Player Name. */ void OAI_StoreCampaignHenchman(object oPC); //Use this Function to Retrieve Your Henchman Persistently void OAI_RetrieveCampaignHenchman(object oPC); /******************************************************************************/ //:: SPELLCASTER FUNCTIONS /******************************************************************************/ //:: FUNCTIONS FROM Deva Bryson Winblood (RTS - Harvester Of Souls) // PURPOSE: return TRUE if the target has negative effects int caiGetHasNegativeEffects(object oTarget); // PURPOSE: return if the target is petrified int fnIsPetrified(object oTarget); // PURPOSE: return a useful to spell to help with target PC int caiGetAvailableHealPC(object oNPC,object oTarget); // PURPOSE: Determine best healing spell available for given damage int caiGetAvailableHeal(object oNPC,int nDamageAmount,int bMUSTHEAL=FALSE); // PURPOSE: Look for buff spells int caiGetAvailableBuff(object oNPC,object oTarget); // PURPOSE: find out what type of charm target this is int fnGetCharmType(object oTarget); // PURPOSE: Returns TRUE if the target has spells on them int fnGetHasSpellDefense(object oTarget); // PURPOSE RETURN: Combat spell int caiGetAvailableCombatSpell(object oNPC,object oTarget); // PURPOSE: To return a defensive spell that oNPC has that is useful to oTarget. int caiGetAvailableDefensiveSpell(object oNPC,object oTarget); // PURPOSE: Return spells to counter invisibility, stealth, etc. int caiProfessionalAntiStealth(); // PURPOSE: Return defensive spells versus specified target int caiProfessionalDefensive(object oTarget); // PURPOSE: Return counter magic to spells on target int caiProfessionalCounter(object oTarget); // PURPOSE: Return offensive close quarter spell int caiProfessionalCloseQuarters(object oTarget); // PURPOSE: Return offensive spells versus the target int caiProfessionalOffensive(object oTarget); // PURPOSE: Get the Best Object To Heal object caiGetBestObjectToHeal(object oMe); /******************************************************************************/ /******************************************************************************/ /***** FUNCTIONS FROM BIOWARE AND OLANDER *****/ //Checks for Any Nearby Spell Casters int OAI_GetCanEnemiesCastSpells(); //Determines and Action After Casting a Spell int WhatToDoAfterCasting(object oSelf); //For Trigger Cast Buffs on Spawn void UseSpellBuffs(object oCreature = OBJECT_SELF); // ADVANCED BUFF SELF // Returns TRUE on successful use, FALSE otherwise. int OAI_AdvancedBuff(float fDistance, int bInstant = TRUE); //Cast Aura Effects on Caster void CastAuras(); //Returns TRUE if Creature Can Use Turning int OAI_UseTurning(); //Determines what attack type to use when using a Ranged Weapon or passes onto Melee below. void OAI_Fighting(object oTarget); //Does the Summon Hordes ability void SummonHordes(); //Checks to see if I am under melee attack, used in group actions int IsUnderMeleeAttack(object oWho = OBJECT_SELF); //Casts the Resurection or Raise Dead Spell //Called from DetermineAllyToRez() int CastRezOn(object oTarget); //Determines an Ally to Rez int DetermineAllyToRez(); //Main Trigger Call to Execute Some Spawn Variables void CastTriggers(); //Verifies if an NPC is Under Direct Melee Attack int IsUnderMeleeAttack(object oWho = OBJECT_SELF); //Manages an Enemy's AOE int ManageEnemyAOE(); //Special Dragon Winged Buffet Combat //Called from SpecialDragonStuff(object oFoe) int DragonWingBuffet(object oFoe); //Special Dragon Combat AI int SpecialDragonStuff(object oFoe); //Special Beholder Combat AI void SpecialBeholderStuff(object oFoe); //Beholder Special AI Eyeball Ray Attack void OAI_EyeballRayAttack(object oTarget = OBJECT_SELF); //Beholder Special AI Beholder Ray Attack void OAI_BeholderRayAttack(object oTarget = OBJECT_SELF); //Special Gelatinous Cube AI void SpecialGelatinousCubeStuff(object oFoe); //Talent for Gelatinous Cube AI int OAI_CheckEngulf(object oTarget = OBJECT_SELF); //Engulf anyone within the Gelatinous Cube. //Can be called as Engulf(FALSE) to release all engulfed victims immediately. void OAI_Engulf(int nEngulf = TRUE); //Called from Engulf(int nEngulf = TRUE) void OAI_EngulfVictim(object oVictim); //Mind Flayer Special Role AI int OAI_MindFlayerCombat(object oTarget); //Checks for Mind Flayer Brain Suck Conditions int MFGetTargetConditionSucks(object oTarget); //Special Spider Tactics int OAI_SpiderTactics(object oTarget); //Troll Hearbeat Functon void TrollHB(); //Troll Attacked Function void TrollAttacked(); //Troll Damaged Function void TrollDamaged(); //Troll Spell Cast At Function void TrollSpellCastAt(); //Troll Death Function int TrollDeath(); //Breaks the Illusionary Creature int BreakIllusion(object oTarget, int nAmDead = FALSE); //The Main Routine For the Status Caster void StatusCaster(object oTarget, int nState = 1); //The Main Routine For the Attack Caster void AttackCaster(object oTarget, int nState = 1); //The Main Routine For the AOE Caster void AOECaster(object oTarget, int nState = 1); //The Main Routine For the Buffer Caster void BufferCaster(object oTarget, int nState = 1); /******************************************************************************/ //:: SPECIAL FUNCTIONS //Barbarian Setup void SetUpBarbarian(object oCreature); //Bard Setup void SetUpBard(object oCreature); //Cleric Setup void SetUpCleric(object oCreature); //Druid Setup void SetUpDruid(object oCreature); //Fighter Setup void SetUpFighter(object oCreature); //Monk Setup void SetUpMonk(object oCreature); //Paladin Setup void SetUpPaladin(object oCreature); //Ranger Setup void SetUpRanger(object oCreature); //Rogue Setup void SetUpRogue(object oCreature); //Sorcerer Setup void SetUpSorcerer(object oCreature); //Wizard Setup void SetUpWizard(object oCreature); /******************************************************************************/ //:: MELEE FUNCTIONS //Checks to See if a Target is In Melee Range int GetIsTargetInMeleeRange(object oTarget,object oCreature=OBJECT_SELF); //OAI Critical System (On Damaged Event....does not Work for Players) void OAI_Crits(object oDamager,object oCreature=OBJECT_SELF); //Kills the Creature in Cool Ways void OAI_CritKills(object oCreature, object oKiller); //Calcs the Melee Crit Chance Potential int OAI_MeleeCalcCritChance(object oDamager, object oCreature, object oWeapon); //Calcs Ranged Weapon Kill Crit Chance int OAI_RangedCalcKillChance(object oDamager, object oCreature, object oWeapon); //Creature Will Whirlwind if They have the Feat (Based Upon Logic and Chance) int TryToWhirl(object oCreature); //Teleport Move to a Random Location in an Area void BlinkMove(); //Teleport Close to the Target and Continue Melee void BlinkMelee(object oTarget); //General Melee Combat void MeleeGeneral(object oTarget,object oCreature = OBJECT_SELF); //Ranged Combat void RangedCombat(object oTarget,object oCreature = OBJECT_SELF); //Religious Melee Combat void MeleeReligious(object oTarget,object oCreature = OBJECT_SELF); //Smite Melee Combat void MeleeSmite(object oTarget,object oCreature = OBJECT_SELF); //Sneak Melee Combat void MeleeSneak(object oTarget,object oCreature = OBJECT_SELF); //Dexterity Melee Combat void MeleeDexterity(object oTarget,object oCreature = OBJECT_SELF); //Weapon Master Melee Combat void MeleeWeaponMaster(object oTarget,object oCreature = OBJECT_SELF); //Palemaster Melee Combat void MeleePalemaster(object oTarget,object oCreature = OBJECT_SELF); //Dragon Disciple Melee Combat void MeleeRDD(object oTarget,object oCreature = OBJECT_SELF); //Shifter Melee Combat void MeleeShifter(object oTarget,object oCreature = OBJECT_SELF); //Monk Melee Combat void MeleeMonk(object oTarget,object oCreature = OBJECT_SELF); //: FUNCTION DEFINITIONS /******************************************************************************/ /******************************************************************************/ //: AI FUNCTIONS void SetStatusCondition(int nCondition, int bValid = TRUE) { string sSC = IntToString(nCondition); if(bValid == TRUE) { SetLocalInt(OBJECT_SELF, "OAI_" + sSC, nCondition); } else if(bValid == FALSE) { SetLocalInt(OBJECT_SELF, "OAI_" + sSC, 0); } } int GetStatusCondition(int nCondition, object oWho = OBJECT_SELF) { string sSC = IntToString(nCondition); int nPlot = GetLocalInt(oWho, "OAI_" + sSC); if(nPlot == nCondition) return TRUE; return FALSE; } void SetBattleCondition(int nCondition, int bValid = TRUE, object oWho = OBJECT_SELF) { string sBC = IntToString(nCondition); if(bValid == TRUE) { SetLocalInt(oWho, "OAI_" + sBC, nCondition); } else if(bValid == FALSE) { SetLocalInt(oWho, "OAI_" + sBC, 0); } } int GetBattleCondition(int nCondition, object oWho = OBJECT_SELF) { string sBC = IntToString(nCondition); int nPlot = GetLocalInt(oWho, "OAI_" + sBC); if(nPlot == nCondition) return TRUE; return FALSE; } int OAI_GetIsDivineCaster(object oCreature) { // caiGetIsCleric() int nClass1 = GetClassByPosition(1,oCreature); if (nClass1 == CLASS_TYPE_CLERIC || nClass1 == CLASS_TYPE_DRUID) return TRUE; int nClass2 = GetClassByPosition(2,oCreature); if (nClass2 == CLASS_TYPE_CLERIC || nClass2 == CLASS_TYPE_DRUID) return TRUE; int nClass3 = GetClassByPosition(3,oCreature); if (nClass3 == CLASS_TYPE_CLERIC || nClass3 == CLASS_TYPE_DRUID) return TRUE; return FALSE; } int OAI_GetIsArcane(object oCreature) {// caiGetIsArcane() int nClass1 = GetClassByPosition(1,oCreature); if (nClass1 == CLASS_TYPE_WIZARD || nClass1 == CLASS_TYPE_SORCERER || nClass1 == CLASS_TYPE_BARD) return TRUE; int nClass2 = GetClassByPosition(2,oCreature); if (nClass2 == CLASS_TYPE_WIZARD || nClass2 == CLASS_TYPE_SORCERER || nClass2 == CLASS_TYPE_BARD) return TRUE; int nClass3 = GetClassByPosition(3,oCreature); if (nClass3 == CLASS_TYPE_WIZARD || nClass3 == CLASS_TYPE_SORCERER || nClass3 == CLASS_TYPE_BARD) return TRUE; return FALSE; } void OAI_RemoveEffects(object oTarget=OBJECT_SELF,object oFrom=OBJECT_INVALID, int nType=-1,int nSubType=-1,int nDurationType=-1,int nSpellId=-1) { effect eEffect = GetFirstEffect(oTarget); while(GetIsEffectValid(eEffect)) { if((oFrom == OBJECT_INVALID || GetEffectCreator(eEffect) == oFrom) &&(nType==-1 || GetEffectType(eEffect)==nType) &&(nSubType==-1 || GetEffectSubType(eEffect)==nSubType) &&(nDurationType==-1 || GetEffectDurationType(eEffect)==nDurationType) &&(nSpellId==-1 || GetEffectSpellId(eEffect)==nSpellId)) RemoveEffect(oTarget,eEffect); eEffect = GetNextEffect(oTarget); } } int OAI_GetIsAlly(object oTarget) { //Same Faction/Ally/Axis No Retribution string sCheck = GetLocalString(OBJECT_SELF,OAI_FACTION); string sTarget = GetLocalString(oTarget,OAI_FACTION); if(GetFactionEqual(oTarget, OBJECT_SELF) == TRUE) { //ClearPersonalReputation(oTarget, OBJECT_SELF); //ClearPersonalReputation(OBJECT_SELF, oTarget); return TRUE; } else if(sCheck == sTarget) { //ClearPersonalReputation(oTarget, OBJECT_SELF); //ClearPersonalReputation(OBJECT_SELF, oTarget); return TRUE; } return FALSE; } object OAI_AcquireTarget() { //object oLastTarget = GetAttackTarget(); int nRace=GetRacialType(OBJECT_SELF); object oRet=OBJECT_INVALID; int nN; float fD; int nVal; object oOb; int nThis; int nC; nN=1; oOb=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,OBJECT_SELF,nN,CREATURE_TYPE_IS_ALIVE,TRUE,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN); fD=GetDistanceBetween(oOb,OBJECT_SELF); while(oOb!=OBJECT_INVALID&&fD<30.0) { // check all nearby targets nThis=0; nN++; if (fD<20.0) nThis++; if (fD<15.0) nThis++; if (fD<10.0) nThis++; if (fD<8.0) nThis++; if (fD<5.0) nThis++; fD=IntToFloat(GetCurrentHitPoints(oOb))/IntToFloat(GetMaxHitPoints(oOb)); if (fD<0.51) nThis++; if (fD<0.31) nThis++; if (fD<0.11) nThis++; if (nRace==RACIAL_TYPE_UNDEAD) { // see if target is a cleric nC=GetClassByPosition(1,oOb); if (nC==CLASS_TYPE_CLERIC||nC==CLASS_TYPE_PALADIN||nC==CLASS_TYPE_DIVINECHAMPION||nC==CLASS_TYPE_BLACKGUARD) nThis=nThis+3; nC=GetClassByPosition(2,oOb); if (nC==CLASS_TYPE_CLERIC||nC==CLASS_TYPE_PALADIN||nC==CLASS_TYPE_DIVINECHAMPION||nC==CLASS_TYPE_BLACKGUARD) nThis=nThis+3; nC=GetClassByPosition(3,oOb); if (nC==CLASS_TYPE_CLERIC||nC==CLASS_TYPE_PALADIN||nC==CLASS_TYPE_DIVINECHAMPION||nC==CLASS_TYPE_BLACKGUARD) nThis=nThis+3; } // see if target is a cleric if(nThis>nVal && !OAI_GetIsAlly(oOb)) { // new best target oRet=oOb; nVal=nThis; } // new best target oOb=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,OBJECT_SELF,nN,CREATURE_TYPE_IS_ALIVE,TRUE,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN); fD=GetDistanceBetween(oOb,OBJECT_SELF); } // check all nearby targets return oRet; /* if(GetIsObjectValid(oLastTarget) == TRUE) { //Allies if(!OAI_GetIsAlly(oLastTarget)) return oLastTarget; } else { //Hated Class First Trial (Copied from x0_i0_generic) int nHatedClass = GetLocalInt(OBJECT_SELF, "NW_L_BEHAVIOUR1") - 1; if (nHatedClass == -1) { bkSetupBehavior(1); nHatedClass = GetLocalInt(OBJECT_SELF, "NW_L_BEHAVIOUR1") - 1; } // * First try to attack the class you hate the most object oTarget = GetNearestPerceivedEnemy(OBJECT_SELF, 1,CREATURE_TYPE_CLASS,nHatedClass); if(GetIsObjectValid(oTarget) && !GetAssociateState(NW_ASC_MODE_DYING, oTarget)) return oTarget; int nNth = 1; object oNT = GetNearestPerceivedEnemy(OBJECT_SELF,nNth); while(GetIsObjectValid(oNT) && GetAssociateState(NW_ASC_MODE_DYING, oNT) && nNth <=100) { //Enemies if(!OAI_GetIsAlly(oNT)) return oNT; //Allies (Just Clears Reputations) if(OAI_GetIsAlly(oNT)){} nNth++; oNT = GetNearestPerceivedEnemy(OBJECT_SELF,nNth); } return OBJECT_INVALID; } */ //return OBJECT_INVALID; } int OAI_ClassIsSpellCaster(int nPos,object oNPC) { int nClass=GetClassByPosition(nPos,oNPC); int bRet=FALSE; switch(nClass) { case CLASS_TYPE_ARCANE_ARCHER: case CLASS_TYPE_BARD: case CLASS_TYPE_CLERIC: case CLASS_TYPE_DRUID: case CLASS_TYPE_FEY: case CLASS_TYPE_DRAGONDISCIPLE: case CLASS_TYPE_PALADIN: case CLASS_TYPE_PALEMASTER: case CLASS_TYPE_RANGER: case CLASS_TYPE_SHADOWDANCER: case CLASS_TYPE_SHIFTER: case CLASS_TYPE_SORCERER: case CLASS_TYPE_WIZARD: { bRet=TRUE; break; } default: { break; } } return bRet; } int OAI_CanCastSpells(object oNPC) { if (OAI_ClassIsSpellCaster(1,oNPC)) return TRUE; else if (OAI_ClassIsSpellCaster(2,oNPC)) return TRUE; else if (OAI_ClassIsSpellCaster(3,oNPC)) return TRUE; return FALSE; } void OAI_SetCounts() { object oMe=OBJECT_SELF; object oEnemy; int nN=1; int nUND=0; int nOUT=0; int nCON=0; int nARC=0; int nDIV=0; int nDRA=0; int nRGD=0; int nMEL=0; int nV,nR; object oItem; oEnemy=GetNearestCreature(CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,oMe,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,CREATURE_TYPE_IS_ALIVE,TRUE); while(GetIsObjectValid(oEnemy)) { // count enemies oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oEnemy); nV=IsMeleeWeapon(oItem); nR=IsRangedWeapon(oItem); if (nV==TRUE) nMEL++; if (nR==TRUE) nRGD++; if (OAI_GetIsDivineCaster(oEnemy)) nDIV++; if (OAI_GetIsArcane(oEnemy)) nARC++; nV=GetRacialType(oEnemy); if (nV==RACIAL_TYPE_UNDEAD) nUND++; else if (nV==RACIAL_TYPE_OUTSIDER) nOUT++; else if (nV==RACIAL_TYPE_CONSTRUCT) nCON++; else if (nV==RACIAL_TYPE_DRAGON) nDRA++; nN++; oEnemy=GetNearestCreature(CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,oMe,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,CREATURE_TYPE_IS_ALIVE,TRUE); } // count enemies SetLocalInt(oMe,"nCAICountUND",nUND); SetLocalInt(oMe,"nCAICountOUT",nOUT); SetLocalInt(oMe,"nCAICountCON",nCON); SetLocalInt(oMe,"nCAICountARC",nARC); SetLocalInt(oMe,"nCAICountDIV",nDIV); SetLocalInt(oMe,"nCAICountDRA",nDRA); SetLocalInt(oMe,"nCAICountRGD",nRGD); SetLocalInt(oMe,"nCAICountMEL",nMEL); } int OAI_GetCanEnemiesCastSpells() { object oMe=OBJECT_SELF; int nN; float fD; object oOb; oOb=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oMe,nN,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE); fD=GetDistanceBetween(oMe,oOb); while(GetIsObjectValid(oOb)&&fD<25.0) { if (OAI_CanCastSpells(oOb)) { if(!OAI_GetIsAlly(oOb)) { SetLocalObject(oMe,"OAI_HAS_CASTER",oOb); return TRUE; } } nN++; oOb=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oMe,nN,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN,CREATURE_TYPE_IS_ALIVE,TRUE); fD=GetDistanceBetween(oMe,oOb); } return FALSE; } int GetAreaWidth(object oArea) { int nX = 0; int nY = 0; vector vTile = Vector(0.0, 0.0, 0.0); location locTile; for (nX = 0; nX < 32; ++nX) { vTile.x = IntToFloat(nX); locTile = Location(oArea, vTile, 0.0); int iColor = GetTileMainLight1Color(locTile); if (iColor < 0 || iColor > 32) return(nX); } return 32; } int GetAreaHeight(object oArea) { int nX = 0; int nY = 0; vector vTile = Vector(0.0, 0.0, 0.0); location locTile; for (nY = 0; nY < 32; ++nY) { vTile.y = IntToFloat(nY); locTile = Location(oArea, vTile, 0.0); int iColor = GetTileMainLight1Color(locTile); if (iColor < 0 || iColor > 32) return(nY); } return 32; } location RandomLocation(object oArea,int nAir = 1) { location lLoc; int nMX = GetAreaWidth(oArea); int nMY = GetAreaHeight(oArea); int nCX = Random(nMX)*10; int nCY = Random(nMY)*10; int nDX = Random(10); int nDY = Random(10); float fDX = IntToFloat(nDX) * 0.1; float fDY = IntToFloat(nDY) * 0.1; float fCX = IntToFloat(nCX) + fDX; float fCY = IntToFloat(nCY) + fDY; int nZ; float fCZ = 0.0; if (nAir == 2) { nZ = Random(50); fCZ = IntToFloat(nZ) * 0.1; } vector vVec = Vector(fCX,fCY,fCZ); lLoc = Location(oArea,vVec,0.0); return lLoc; } /*:://///////////////////////////////////////////// //:: Name: AI ON, or OFF. //:://///////////////////////////////////////////// Scripted version of AI on/off toggle. It stops all AI scripts from running - using "if(GetAIStatus()) return;" Simple, but effective! //::////////////////////////////////////////////*/ // Override for all AI scripts (dk: well perceive and hrtbeat mostly) const string AI_TOGGLE = "AI_TOGGLE"; // INTEGER int GetAIOff(object oTarget) { if(GetIsDead(oTarget) || !GetCommandable(oTarget) || GetLocalInt(oTarget, AI_TOGGLE)) { return TRUE; } return FALSE; } void SetAIOff(object oTarget) { SetLocalInt(oTarget, AI_TOGGLE, TRUE); } void SetAIOn(object oTarget) { DeleteLocalInt(oTarget, AI_TOGGLE); } /******************************************************************************/ //:: SPELLCASTER FUNCTIONS /******************************************************************************/ //:: FUNCTIONS FROM Deva Bryson Winblood (RTS - Harvester Of Souls) int caiGetHasNegativeEffects(object oTarget) { // PURPOSE: return TRUE if the target has negative effects effect eE=GetFirstEffect(oTarget); int nET; while(GetIsEffectValid(eE)) { // check each effect nET=GetEffectType(eE); switch(nET) { case EFFECT_TYPE_BLINDNESS: case EFFECT_TYPE_CONFUSED: case EFFECT_TYPE_CURSE: case EFFECT_TYPE_DAMAGE_DECREASE: case EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE: case EFFECT_TYPE_DAZED: case EFFECT_TYPE_DEAF: case EFFECT_TYPE_DISEASE: case EFFECT_TYPE_FRIGHTENED: case EFFECT_TYPE_MOVEMENT_SPEED_DECREASE: case EFFECT_TYPE_NEGATIVELEVEL: case EFFECT_TYPE_PARALYZE: case EFFECT_TYPE_POISON: case EFFECT_TYPE_SILENCE: case EFFECT_TYPE_SKILL_DECREASE: case EFFECT_TYPE_SPELL_RESISTANCE_DECREASE: case EFFECT_TYPE_STUNNED: case EFFECT_TYPE_TURN_RESISTANCE_DECREASE: case EFFECT_TYPE_ABILITY_DECREASE: case EFFECT_TYPE_AC_DECREASE: case EFFECT_TYPE_ATTACK_DECREASE: { return TRUE; break; } default: break; } eE=GetNextEffect(oTarget); } // check each effect return FALSE; } // caiGetHasNegativeEffects(); int fnIsPetrified(object oTarget) { // PURPOSE: return if the target is petrified effect eE=GetFirstEffect(oTarget); int nET; while(GetIsEffectValid(eE)) { // check each effect nET=GetEffectType(eE); switch(nET) { case EFFECT_TYPE_PETRIFY: { return TRUE; break; } default: break; } eE=GetNextEffect(oTarget); } // check each effect return FALSE; } // fnIsPetrified() int caiGetAvailableHealPC(object oNPC,object oTarget) { // PURPOSE: return a useful to spell to help with target PC int nDMG=GetMaxHitPoints(oTarget)-GetCurrentHitPoints(oTarget); int bHasNegativeEffects=caiGetHasNegativeEffects(oTarget); if ((GetHasSpellEffect(SPELL_FLESH_TO_STONE,oTarget)||fnIsPetrified(oTarget))&&GetHasSpell(SPELL_STONE_TO_FLESH,oNPC)>0) return SPELL_STONE_TO_FLESH; else if (GetIsDead(oTarget)&&GetHasSpell(SPELL_RESURRECTION,oNPC)>0) return SPELL_RESURRECTION; else if (GetIsDead(oTarget)&&GetHasSpell(SPELL_RAISE_DEAD,oNPC)>0) return SPELL_RAISE_DEAD; else if (GetHasSpellEffect(SPELL_BESTOW_CURSE,oTarget)&&GetHasSpell(SPELL_REMOVE_CURSE,oNPC)>0) return SPELL_REMOVE_CURSE; else if (GetHasSpellEffect(SPELL_CONTAGION,oTarget)&&GetHasSpell(SPELL_REMOVE_DISEASE,oNPC)>0) return SPELL_REMOVE_DISEASE; else if ((GetHasSpellEffect(SPELL_BLINDNESS_AND_DEAFNESS,oTarget)||GetHasSpellEffect(SPELL_MASS_BLINDNESS_AND_DEAFNESS,oTarget))&&GetHasSpell(SPELL_REMOVE_BLINDNESS_AND_DEAFNESS,oNPC)>0) return SPELL_REMOVE_BLINDNESS_AND_DEAFNESS; else if (GetHasSpellEffect(SPELL_FEAR,oTarget)&&GetHasSpell(SPELL_REMOVE_FEAR,oNPC)>0) return SPELL_REMOVE_FEAR; else if (GetHasSpellEffect(SPELL_HOLD_PERSON,oTarget)&&GetHasSpell(SPELL_REMOVE_PARALYSIS,oNPC)>0) return SPELL_REMOVE_PARALYSIS; else if (bHasNegativeEffects&&GetHasSpell(SPELL_GREATER_RESTORATION,oNPC)>0) return SPELL_GREATER_RESTORATION; else if (bHasNegativeEffects&&GetHasSpell(SPELL_RESTORATION,oNPC)>0) return SPELL_RESTORATION; else if (bHasNegativeEffects&&GetHasSpell(SPELL_LESSER_RESTORATION,oNPC)>0) return SPELL_LESSER_RESTORATION; else if (nDMG>0) return caiGetAvailableHeal(oNPC,nDMG); return 0; } // caiGetAvailableHealPC() int caiGetAvailableHeal(object oNPC,int nDamageAmount,int bMUSTHEAL=FALSE) { // PURPOSE: Determine best healing spell available for given damage int nRet=0; if (nDamageAmount<4) { // minor if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; if (bMUSTHEAL) { // need a heal spell if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_REGENERATE,oNPC)>0) return SPELL_REGENERATE; } // need a heal spell } // minor else if (nDamageAmount<9) { // light if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; if (bMUSTHEAL) { // need a heal spell if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_REGENERATE,oNPC)>0) return SPELL_REGENERATE; } // need a heal spell } // light else if (nDamageAmount<16) { // moderate if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; if (bMUSTHEAL) { // need a heal spell if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_REGENERATE,oNPC)>0) return SPELL_REGENERATE; } // need a heal spell } // moderate else if (nDamageAmount<31) { // serious if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; if (bMUSTHEAL) { // need a heal spell if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_REGENERATE,oNPC)>0) return SPELL_REGENERATE; } // need a heal spell } // serious else if (nDamageAmount<51) { // critical if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; if (bMUSTHEAL) { // need a heal spell if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_REGENERATE,oNPC)>0) return SPELL_REGENERATE; } // need a heal spell } // critical else { // heal if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; if (bMUSTHEAL) { // need a heal spell if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_REGENERATE,oNPC)>0) return SPELL_REGENERATE; } // need a heal spell } // heal return nRet; } // caiGetAvailableHeal() int caiGetAvailableBuff(object oNPC,object oTarget) { // PURPOSE: Look for buff spells int nRet=0; float fCR=GetChallengeRating(oTarget); if (GetIsPC(oTarget)) fCR=IntToFloat(GetLevelByPosition(1,oTarget)+GetLevelByPosition(2,oTarget)+GetLevelByPosition(3,oTarget)); if (fCR<2.0) { // lesser buffs if(GetRacialType(oTarget)==RACIAL_TYPE_UNDEAD) { // undead target if (GetHasSpell(SPELL_STONE_BONES,oNPC)>0&&GetHasSpellEffect(SPELL_STONE_BONES,oTarget)==FALSE) return SPELL_STONE_BONES; else if (GetHasSpell(SPELL_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_MAGIC_WEAPON; else if (GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_BULLS_STRENGTH; } // undead target else { // not undead if (GetHasSpell(SPELL_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_MAGIC_WEAPON; else if (GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_BARKSKIN,oNPC)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oTarget)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_ENDURANCE,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURANCE,oTarget)==FALSE) return SPELL_ENDURANCE; else if (GetHasSpell(SPELL_BLESS,oNPC)>0&&GetHasSpellEffect(SPELL_BLESS,oTarget)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_AID,oNPC)>0&&GetHasSpellEffect(SPELL_AID,oTarget)==FALSE) return SPELL_AID; } // not undead } // lesser buffs else if (fCR<10.0) { // medium buffs if(GetRacialType(oTarget)==RACIAL_TYPE_UNDEAD) { // undead target if (GetHasSpell(SPELL_STONE_BONES,oNPC)>0&&GetHasSpellEffect(SPELL_STONE_BONES,oTarget)==FALSE) return SPELL_STONE_BONES; else if (GetHasSpell(SPELL_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_MAGIC_WEAPON; else if (GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_BARKSKIN,oNPC)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oTarget)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_ENDURANCE,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURANCE,oTarget)==FALSE) return SPELL_ENDURANCE; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oTarget)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_FLAME_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_FLAME_WEAPON,oTarget)==FALSE) return SPELL_FLAME_WEAPON; else if (GetHasSpell(SPELL_HASTE,oNPC)>0&&GetHasSpellEffect(SPELL_HASTE,oTarget)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oTarget)==FALSE) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_STONESKIN,oTarget)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_UNHOLY_AURA,oNPC)>0&&GetHasSpellEffect(SPELL_UNHOLY_AURA,oTarget)==FALSE) return SPELL_UNHOLY_AURA; } // undead target else { // not undead if (GetHasSpell(SPELL_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_MAGIC_WEAPON; else if (GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_BARKSKIN,oNPC)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oTarget)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_ENDURANCE,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURANCE,oTarget)==FALSE) return SPELL_ENDURANCE; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oTarget)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_FLAME_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_FLAME_WEAPON,oTarget)==FALSE) return SPELL_FLAME_WEAPON; else if (GetHasSpell(SPELL_HASTE,oNPC)>0&&GetHasSpellEffect(SPELL_HASTE,oTarget)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oTarget)==FALSE) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_STONESKIN,oTarget)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_UNHOLY_AURA,oNPC)>0&&GetHasSpellEffect(SPELL_UNHOLY_AURA,oTarget)==FALSE) return SPELL_UNHOLY_AURA; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oTarget)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_GREATER_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_GREATER_MAGIC_WEAPON; else if (GetHasSpell(SPELL_GREATER_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_GREATER_BULLS_STRENGTH; else if (GetHasSpell(SPELL_FOXS_CUNNING,oNPC)>0&&GetHasSpellEffect(SPELL_FOXS_CUNNING,oTarget)==FALSE) return SPELL_FOXS_CUNNING; else if (GetHasSpell(SPELL_EAGLE_SPLEDOR,oNPC)>0&&GetHasSpellEffect(SPELL_EAGLE_SPLEDOR,oTarget)==FALSE) return SPELL_EAGLE_SPLEDOR; else if (GetHasSpell(SPELL_BLESS,oNPC)>0&&GetHasSpellEffect(SPELL_BLESS,oTarget)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_BLESS_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_BLESS_WEAPON,oTarget)==FALSE) return SPELL_BLESS_WEAPON; else if (GetHasSpell(SPELL_AID,oNPC)>0&&GetHasSpellEffect(SPELL_AID,oTarget)==FALSE) return SPELL_AID; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oTarget)==FALSE) return SPELL_SEE_INVISIBILITY; } // not undead } // medium buffs else { // big buffs if(GetRacialType(oTarget)==RACIAL_TYPE_UNDEAD) { // undead target if (GetHasSpell(SPELL_STONE_BONES,oNPC)>0&&GetHasSpellEffect(SPELL_STONE_BONES,oTarget)==FALSE) return SPELL_STONE_BONES; else if (GetHasSpell(SPELL_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_MAGIC_WEAPON; else if (GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_BARKSKIN,oNPC)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oTarget)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_ENDURANCE,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURANCE,oTarget)==FALSE) return SPELL_ENDURANCE; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oTarget)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_FLAME_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_FLAME_WEAPON,oTarget)==FALSE) return SPELL_FLAME_WEAPON; else if (GetHasSpell(SPELL_HASTE,oNPC)>0&&GetHasSpellEffect(SPELL_HASTE,oTarget)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oTarget)==FALSE) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_STONESKIN,oTarget)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_UNHOLY_AURA,oNPC)>0&&GetHasSpellEffect(SPELL_UNHOLY_AURA,oTarget)==FALSE) return SPELL_UNHOLY_AURA; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oTarget)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_GREATER_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_GREATER_MAGIC_WEAPON; else if (GetHasSpell(SPELL_GREATER_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_GREATER_BULLS_STRENGTH; } // undead target else { // not undead if (GetHasSpell(SPELL_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_MAGIC_WEAPON; else if (GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_BARKSKIN,oNPC)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oTarget)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_ENDURANCE,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURANCE,oTarget)==FALSE) return SPELL_ENDURANCE; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oTarget)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_FLAME_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_FLAME_WEAPON,oTarget)==FALSE) return SPELL_FLAME_WEAPON; else if (GetHasSpell(SPELL_HASTE,oNPC)>0&&GetHasSpellEffect(SPELL_HASTE,oTarget)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oTarget)==FALSE) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_STONESKIN,oTarget)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_UNHOLY_AURA,oNPC)>0&&GetHasSpellEffect(SPELL_UNHOLY_AURA,oTarget)==FALSE) return SPELL_UNHOLY_AURA; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oTarget)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_GREATER_MAGIC_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_MAGIC_WEAPON,oTarget)==FALSE) return SPELL_GREATER_MAGIC_WEAPON; else if (GetHasSpell(SPELL_GREATER_BULLS_STRENGTH,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_BULLS_STRENGTH,oTarget)==FALSE) return SPELL_GREATER_BULLS_STRENGTH; else if (GetHasSpell(SPELL_FOXS_CUNNING,oNPC)>0&&GetHasSpellEffect(SPELL_FOXS_CUNNING,oTarget)==FALSE) return SPELL_FOXS_CUNNING; else if (GetHasSpell(SPELL_EAGLE_SPLEDOR,oNPC)>0&&GetHasSpellEffect(SPELL_EAGLE_SPLEDOR,oTarget)==FALSE) return SPELL_EAGLE_SPLEDOR; else if (GetHasSpell(SPELL_BLESS,oNPC)>0&&GetHasSpellEffect(SPELL_BLESS,oTarget)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_BLESS_WEAPON,oNPC)>0&&GetHasSpellEffect(SPELL_BLESS_WEAPON,oTarget)==FALSE) return SPELL_BLESS_WEAPON; else if (GetHasSpell(SPELL_AID,oNPC)>0&&GetHasSpellEffect(SPELL_AID,oTarget)==FALSE) return SPELL_AID; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oTarget)==FALSE) return SPELL_SEE_INVISIBILITY; else if (GetHasSpell(SPELL_MASS_HASTE,oNPC)>0&&GetHasSpellEffect(SPELL_MASS_HASTE,oTarget)==FALSE) return SPELL_MASS_HASTE; else if (GetHasSpell(SPELL_OWLS_WISDOM,oNPC)>0&&GetHasSpellEffect(SPELL_OWLS_WISDOM,oTarget)==FALSE) return SPELL_OWLS_WISDOM; else if (GetHasSpell(SPELL_SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_SPELL_RESISTANCE; } // not undead } // big buffs return nRet; } // caiGetAvailableBuff() int fnGetCharmType(object oTarget) { // PURPOSE: find out what type of charm target this is int nRT=GetRacialType(oTarget); switch(nRT) { case RACIAL_TYPE_ANIMAL: { return CAI_CHARM_ANIMAL; break; } case RACIAL_TYPE_DWARF: case RACIAL_TYPE_ELF: case RACIAL_TYPE_GNOME: case RACIAL_TYPE_HALFELF: case RACIAL_TYPE_HALFLING: case RACIAL_TYPE_HALFORC: case RACIAL_TYPE_HUMAN: { return CAI_CHARM_PERSON; break; } case RACIAL_TYPE_BEAST: case RACIAL_TYPE_DRAGON: case RACIAL_TYPE_FEY: case RACIAL_TYPE_GIANT: case RACIAL_TYPE_HUMANOID_GOBLINOID: case RACIAL_TYPE_HUMANOID_MONSTROUS: case RACIAL_TYPE_HUMANOID_ORC: case RACIAL_TYPE_HUMANOID_REPTILIAN: case RACIAL_TYPE_MAGICAL_BEAST: case RACIAL_TYPE_VERMIN: { return CAI_CHARM_MONSTER; break; } default: break; } return CAI_CHARM_NONE; } // fnGetCharmType() int fnGetHasSpellDefense(object oTarget) { // PURPOSE: Returns TRUE if the target has spells on them effect eE=GetFirstEffect(oTarget); int nSID; object oC; while(GetIsEffectValid(eE)) { // check effects nSID=GetEffectSpellId(eE); if (nSID!=-1) { // spell found oC=GetEffectCreator(eE); if (oC==oTarget||GetIsFriend(oC)) return TRUE; } // spell found eE=GetNextEffect(oTarget); } // check effects return FALSE; } // fnGetHasSpellDefense() int caiGetAvailableCombatSpell(object oNPC,object oTarget) { // PURPOSE RETURN: Combat spell int nRT=GetRacialType(oTarget); float fCR=GetChallengeRating(oTarget); int bGroup=FALSE; int bAlliesNear=FALSE; int nCT=fnGetCharmType(oTarget); object oMe=oNPC; object oOb=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,oTarget,1,CREATURE_TYPE_IS_ALIVE,TRUE); int bSC=GetLocalInt(oNPC,"bCAISPELLCASTERS"); float fD=GetDistanceBetween(oNPC,oTarget); if (GetIsObjectValid(oOb)) { // check to see if friends too close for area effect if(GetDistanceBetween(oTarget,oOb)<10.0) bAlliesNear=TRUE; } // check to see if friends too close for area effect oOb=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND,oTarget,1,CREATURE_TYPE_IS_ALIVE,TRUE); if (GetIsObjectValid(oOb)) { // check to see if the enemy is in a group if (GetDistanceBetween(oTarget,oOb)<6.1) bGroup=TRUE; } // check to see if the enemy is in a group if (GetIsPC(oTarget)) { // PC if (GetLocalInt(oTarget,"nIsVampire")==TRUE) nRT=RACIAL_TYPE_UNDEAD; fCR=IntToFloat(GetLevelByPosition(1,oTarget)+GetLevelByPosition(2,oTarget)+GetLevelByPosition(3,oTarget)); } // PC if (GetDistanceBetween(oNPC,oTarget)<10.0) bAlliesNear=TRUE; if (fnGetHasSpellDefense(oTarget)&&d100()<26) { // dispelling magic if (GetHasSpell(SPELL_MORDENKAINENS_DISJUNCTION,oNPC)>0&&d4()<3) return SPELL_MORDENKAINENS_DISJUNCTION; else if (GetHasSpell(SPELL_GREATER_SPELL_BREACH,oNPC)>0&&d4()<3) return SPELL_GREATER_SPELL_BREACH; else if (GetHasSpell(SPELL_GREATER_DISPELLING,oNPC)>0) return SPELL_GREATER_DISPELLING; else if (GetHasSpell(SPELL_LESSER_SPELL_BREACH,oNPC)>0) return SPELL_LESSER_SPELL_BREACH; else if (GetHasSpell(SPELL_DISPEL_MAGIC,oNPC)>0) return SPELL_DISPEL_MAGIC; else if (GetHasSpell(SPELL_INVISIBILITY_PURGE,oNPC)>0&&d4()<3) return SPELL_INVISIBILITY_PURGE; else if (GetHasSpell(SPELL_LESSER_DISPEL,oNPC)>0) return SPELL_LESSER_DISPEL; } // dispelling magic if (nRT==RACIAL_TYPE_UNDEAD) { // undead enemies if (bGroup==TRUE&&!bAlliesNear) { // okay to do area attack if (fCR<6.1) { // low if (GetHasSpell(SPELL_SPIKE_GROWTH,oNPC)>0) return SPELL_SPIKE_GROWTH; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_GREASE,oNPC)>0) return SPELL_GREASE; else if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // low else { // high if (GetHasSpell(SPELL_EPIC_HELLBALL,oNPC)>0&&fD>9.9) return SPELL_EPIC_HELLBALL; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_EPIC_RUIN,oNPC)>0&&fD>9.9) return SPELL_EPIC_RUIN; else if (GetHasSpell(SPELL_METEOR_SWARM,oNPC)>0&&fD>9.9) return SPELL_METEOR_SWARM; else if (GetHasSpell(SPELL_PRISMATIC_SPRAY,oNPC)>0) return SPELL_PRISMATIC_SPRAY; else if (GetHasSpell(SPELL_WAIL_OF_THE_BANSHEE,oNPC)>0) return SPELL_WAIL_OF_THE_BANSHEE; else if (GetHasSpell(SPELL_SUNBURST,oNPC)>0) return SPELL_SUNBURST; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_STORM_OF_VENGEANCE,oNPC)>0) return SPELL_STORM_OF_VENGEANCE; else if (GetHasSpell(SPELL_POWER_WORD_KILL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_POWER_WORD_KILL; else if (GetHasSpell(SPELL_MASS_BLINDNESS_AND_DEAFNESS,oNPC)>0) return SPELL_MASS_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_INCENDIARY_CLOUD,oNPC)>0&&fD>9.9) return SPELL_INCENDIARY_CLOUD; else if (GetHasSpell(SPELL_INFERNO,oNPC)>0) return SPELL_INFERNO; else if (GetHasSpell(SPELL_IMPLOSION,oNPC)>0&&fD>9.9) return SPELL_IMPLOSION; else if (GetHasSpell(SPELL_ICE_STORM,oNPC)>0&&fD>9.9) return SPELL_ICE_STORM; else if (GetHasSpell(SPELL_GREAT_THUNDERCLAP,oNPC)>0) return SPELL_GREAT_THUNDERCLAP; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FIRE_STORM,oNPC)>0&&fD>9.9) return SPELL_FIRE_STORM; else if (GetHasSpell(SPELL_EARTHQUAKE,oNPC)>0) return SPELL_EARTHQUAKE; else if (GetHasSpell(SPELL_DELAYED_BLAST_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_DELAYED_BLAST_FIREBALL; else if (GetHasSpell(SPELL_DESTRUCTION,oNPC)>0) return SPELL_DESTRUCTION; else if (GetHasSpell(SPELL_CREEPING_DOOM,oNPC)>0) return SPELL_CREEPING_DOOM; else if (GetHasSpell(SPELL_CRUMBLE,oNPC)>0) return SPELL_CRUMBLE; else if (GetHasSpell(SPELL_WORD_OF_FAITH,oNPC)>0) return SPELL_WORD_OF_FAITH; else if (GetHasSpell(SPELL_CLOUDKILL,oNPC)>0&&fD>9.9) return SPELL_CLOUDKILL; else if (GetHasSpell(SPELL_CONE_OF_COLD,oNPC)>0) return SPELL_CONE_OF_COLD; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oNPC)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_BLADE_BARRIER,oNPC)>0) return SPELL_BLADE_BARRIER; else if (GetHasSpell(SPELL_BALL_LIGHTNING,oNPC)>0) return SPELL_BALL_LIGHTNING; else if (GetHasSpell(SPELL_DIRGE,oNPC)>0) return SPELL_DIRGE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_EVARDS_BLACK_TENTACLES,oNPC)>0) return SPELL_EVARDS_BLACK_TENTACLES; else if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_FLYING_DEBRIS,oNPC)>0) return SPELL_FLYING_DEBRIS; else if (GetHasSpell(SPELL_GREASE,oNPC)>0) return SPELL_GREASE; else if (GetHasSpell(SPELL_HAMMER_OF_THE_GODS,oNPC)>0) return SPELL_HAMMER_OF_THE_GODS; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SPIKE_GROWTH,oNPC)>0) return SPELL_SPIKE_GROWTH; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0&&fD>9.9) return SPELL_SHADOW_CONJURATION_DARKNESS; } // high } // okay to do area attack if (bGroup==FALSE&&!bAlliesNear) { // use non-area unless needed if (fCR<6.1) { // low if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CONTROL_UNDEAD,oNPC)>0&&GetHasSpellEffect(SPELL_CONTROL_UNDEAD,oTarget)==FALSE) return SPELL_CONTROL_UNDEAD; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_RAY_OF_ENFEEBLEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_RAY_OF_ENFEEBLEMENT,oTarget)==FALSE) return SPELL_RAY_OF_ENFEEBLEMENT; else if (GetHasSpell(SPELL_DAZE,oNPC)>0&&d4()<3) return SPELL_DAZE; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; if (GetHasSpell(SPELL_SPIKE_GROWTH,oNPC)>0) return SPELL_SPIKE_GROWTH; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_GREASE,oNPC)>0) return SPELL_GREASE; else if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_HEALING_CIRCLE,oNPC)>0) return SPELL_HEALING_CIRCLE; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // low else { // high if (GetHasSpell(SPELL_UNDEATH_TO_DEATH,oNPC)>0&&GetIsPC(oTarget)==FALSE) return SPELL_UNDEATH_TO_DEATH; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_FIREBRAND,oNPC)>0) return SPELL_FIREBRAND; else if (GetHasSpell(SPELL_DOMINATE_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_DOMINATE_PERSON; else if (GetHasSpell(SPELL_CONFUSION,oNPC)>0&&GetHasSpellEffect(SPELL_CONFUSION,oTarget)==FALSE&&GetIsPC(oTarget)==TRUE) return SPELL_CONFUSION; else if (GetHasSpell(SPELL_HOLD_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_HOLD_PERSON; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_RAY_OF_ENFEEBLEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_RAY_OF_ENFEEBLEMENT,oTarget)==FALSE) return SPELL_RAY_OF_ENFEEBLEMENT; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; if (GetHasSpell(SPELL_EPIC_HELLBALL,oNPC)>0&&fD>9.9) return SPELL_EPIC_HELLBALL; else if (GetHasSpell(SPELL_MASS_HEAL,oNPC)>0) return SPELL_MASS_HEAL; else if (GetHasSpell(SPELL_EPIC_RUIN,oNPC)>0&&fD>9.9) return SPELL_EPIC_RUIN; else if (GetHasSpell(SPELL_METEOR_SWARM,oNPC)>0&&fD>9.9) return SPELL_METEOR_SWARM; else if (GetHasSpell(SPELL_PRISMATIC_SPRAY,oNPC)>0) return SPELL_PRISMATIC_SPRAY; else if (GetHasSpell(SPELL_WAIL_OF_THE_BANSHEE,oNPC)>0) return SPELL_WAIL_OF_THE_BANSHEE; else if (GetHasSpell(SPELL_SUNBURST,oNPC)>0) return SPELL_SUNBURST; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_STORM_OF_VENGEANCE,oNPC)>0) return SPELL_STORM_OF_VENGEANCE; else if (GetHasSpell(SPELL_POWER_WORD_KILL,oNPC)>0) return SPELL_POWER_WORD_KILL; else if (GetHasSpell(SPELL_MASS_BLINDNESS_AND_DEAFNESS,oNPC)>0) return SPELL_MASS_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_INCENDIARY_CLOUD,oNPC)>0&&fD>9.9) return SPELL_INCENDIARY_CLOUD; else if (GetHasSpell(SPELL_INFERNO,oNPC)>0) return SPELL_INFERNO; else if (GetHasSpell(SPELL_IMPLOSION,oNPC)>0&&fD>9.9) return SPELL_IMPLOSION; else if (GetHasSpell(SPELL_ICE_STORM,oNPC)>0) return SPELL_ICE_STORM; else if (GetHasSpell(SPELL_GREAT_THUNDERCLAP,oNPC)>0) return SPELL_GREAT_THUNDERCLAP; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FIRE_STORM,oNPC)>0&&fD>9.9) return SPELL_FIRE_STORM; else if (GetHasSpell(SPELL_EARTHQUAKE,oNPC)>0) return SPELL_EARTHQUAKE; else if (GetHasSpell(SPELL_DELAYED_BLAST_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_DELAYED_BLAST_FIREBALL; else if (GetHasSpell(SPELL_DESTRUCTION,oNPC)>0) return SPELL_DESTRUCTION; else if (GetHasSpell(SPELL_CREEPING_DOOM,oNPC)>0) return SPELL_CREEPING_DOOM; else if (GetHasSpell(SPELL_CRUMBLE,oNPC)>0) return SPELL_CRUMBLE; else if (GetHasSpell(SPELL_CLOUDKILL,oNPC)>0) return SPELL_CLOUDKILL; else if (GetHasSpell(SPELL_CONE_OF_COLD,oNPC)>0) return SPELL_CONE_OF_COLD; else if (GetHasSpell(SPELL_WORD_OF_FAITH,oNPC)>0) return SPELL_WORD_OF_FAITH; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oNPC)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_BLADE_BARRIER,oNPC)>0) return SPELL_BLADE_BARRIER; else if (GetHasSpell(SPELL_BALL_LIGHTNING,oNPC)>0) return SPELL_BALL_LIGHTNING; else if (GetHasSpell(SPELL_DIRGE,oNPC)>0) return SPELL_DIRGE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_EVARDS_BLACK_TENTACLES,oNPC)>0) return SPELL_EVARDS_BLACK_TENTACLES; else if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_FLYING_DEBRIS,oNPC)>0) return SPELL_FLYING_DEBRIS; else if (GetHasSpell(SPELL_GREASE,oNPC)>0) return SPELL_GREASE; else if (GetHasSpell(SPELL_HAMMER_OF_THE_GODS,oNPC)>0) return SPELL_HAMMER_OF_THE_GODS; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SPIKE_GROWTH,oNPC)>0) return SPELL_SPIKE_GROWTH; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // high } // use non-area unless needed if (fCR<6.1) { // low if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_RAY_OF_ENFEEBLEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_RAY_OF_ENFEEBLEMENT,oTarget)==FALSE) return SPELL_RAY_OF_ENFEEBLEMENT; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CONTROL_UNDEAD,oNPC)>0&&GetHasSpellEffect(SPELL_CONTROL_UNDEAD,oTarget)==FALSE) return SPELL_CONTROL_UNDEAD; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_DAZE,oNPC)>0&&d4()<3) return SPELL_DAZE; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGIC_MISSILE,oNPC)>0) return SPELL_SHADOW_CONJURATION_MAGIC_MISSILE; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW; } // low else { // high if (GetHasSpell(SPELL_UNDEATH_TO_DEATH,oNPC)>0&&GetIsPC(oTarget)==FALSE) return SPELL_UNDEATH_TO_DEATH; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_FIREBRAND,oNPC)>0) return SPELL_FIREBRAND; else if (GetHasSpell(SPELL_BIGBYS_CRUSHING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_CRUSHING_HAND; else if (GetHasSpell(SPELL_BIGBYS_CLENCHED_FIST,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_CLENCHED_FIST,oTarget)==FALSE) return SPELL_BIGBYS_CLENCHED_FIST; else if (GetHasSpell(SPELL_BIGBYS_GRASPING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_GRASPING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_GRASPING_HAND; else if (GetHasSpell(SPELL_BIGBYS_FORCEFUL_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_FORCEFUL_HAND,oTarget)==FALSE) return SPELL_BIGBYS_FORCEFUL_HAND; else if (GetHasSpell(SPELL_BIGBYS_INTERPOSING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_INTERPOSING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_INTERPOSING_HAND; else if (GetHasSpell(SPELL_DOMINATE_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_DOMINATE_PERSON; else if (GetHasSpell(SPELL_CONFUSION,oNPC)>0&&GetHasSpellEffect(SPELL_CONFUSION,oTarget)==FALSE&&GetIsPC(oTarget)==TRUE) return SPELL_CONFUSION; else if (GetHasSpell(SPELL_HOLD_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_HOLD_PERSON; else if (GetHasSpell(SPELL_HEAL,oNPC)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oNPC)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGIC_MISSILE,oNPC)>0) return SPELL_SHADOW_CONJURATION_MAGIC_MISSILE; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oNPC)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oNPC)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oNPC)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oNPC)>0) return SPELL_CURE_MINOR_WOUNDS; } // high } // undead enemies else { // not undead enemies if (bGroup==TRUE&&!bAlliesNear) { // okay to do area attack if (fCR<2.1) { // very low if (GetHasSpell(SPELL_SLEEP,oNPC)>0&&nRT!=RACIAL_TYPE_ELF&&nRT!=RACIAL_TYPE_CONSTRUCT&&GetIsImmune(oTarget,IMMUNITY_TYPE_SLEEP,oMe)==FALSE) return SPELL_SLEEP; else if (GetHasSpell(SPELL_SCARE,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_FEAR,oMe)==FALSE) return SPELL_SCARE; else if (GetHasSpell(SPELL_BANE,oNPC)>0&&GetHasSpellEffect(SPELL_BANE,oTarget)==FALSE) return SPELL_BANE; else if (GetHasSpell(SPELL_STINKING_CLOUD,oNPC)>0&&fD>9.9) return SPELL_STINKING_CLOUD; else if (GetHasSpell(SPELL_SPIKE_GROWTH,oNPC)>0&&fD>9.9) return SPELL_SPIKE_GROWTH; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_FEAR,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_FEAR,oMe)==FALSE) return SPELL_FEAR; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_CLOUD_OF_BEWILDERMENT,oNPC)>0&&fD>9.9&&GetIsImmune(oTarget,IMMUNITY_TYPE_CONFUSED,oMe)==FALSE) return SPELL_CLOUD_OF_BEWILDERMENT; else if (GetHasSpell(SPELL_GREASE,oNPC)>0) return SPELL_GREASE; else if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // very low else if (fCR<6.1) { // low if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_SCINTILLATING_SPHERE,oNPC)>0) return SPELL_SCINTILLATING_SPHERE; else if (GetHasSpell(SPELL_HAMMER_OF_THE_GODS,oNPC)>0) return SPELL_HAMMER_OF_THE_GODS; else if (GetHasSpell(SPELL_STINKING_CLOUD,oNPC)>0&&fD>9.9) return SPELL_STINKING_CLOUD; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_WEIRD,oNPC)>0) return SPELL_WEIRD; else if (GetHasSpell(SPELL_CONE_OF_COLD,oNPC)>0) return SPELL_CONE_OF_COLD; else if (GetHasSpell(SPELL_CLOUDKILL,oNPC)>0&&fD>9.9) return SPELL_CLOUDKILL; else if (GetHasSpell(SPELL_ACID_FOG,oNPC)>0) return SPELL_ACID_FOG; else if (GetHasSpell(SPELL_FEAR,oNPC)>0) return SPELL_FEAR; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_CLOUD_OF_BEWILDERMENT,oNPC)>0&&fD>9.9&&GetIsImmune(oTarget,IMMUNITY_TYPE_CONFUSED,oMe)==FALSE) return SPELL_CLOUD_OF_BEWILDERMENT; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oNPC)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_EVARDS_BLACK_TENTACLES,oNPC)>0) return SPELL_EVARDS_BLACK_TENTACLES; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // low else { // high if (GetHasSpell(SPELL_EPIC_HELLBALL,oNPC)>0&&fD>9.9) return SPELL_EPIC_HELLBALL; else if (GetHasSpell(SPELL_EPIC_RUIN,oNPC)>0&&fD>9.9) return SPELL_EPIC_RUIN; else if (GetHasSpell(SPELL_METEOR_SWARM,oNPC)>0&&fD>9.9) return SPELL_METEOR_SWARM; else if (GetHasSpell(SPELL_PRISMATIC_SPRAY,oNPC)>0) return SPELL_PRISMATIC_SPRAY; else if (GetHasSpell(SPELL_WAIL_OF_THE_BANSHEE,oNPC)>0) return SPELL_WAIL_OF_THE_BANSHEE; else if (GetHasSpell(SPELL_SUNBURST,oNPC)>0) return SPELL_SUNBURST; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_STORM_OF_VENGEANCE,oNPC)>0) return SPELL_STORM_OF_VENGEANCE; else if (GetHasSpell(SPELL_SPHERE_OF_CHAOS,oNPC)>0) return SPELL_SPHERE_OF_CHAOS; else if (GetHasSpell(SPELL_POWER_WORD_KILL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_POWER_WORD_KILL; else if (GetHasSpell(SPELL_NEGATIVE_ENERGY_BURST,oNPC)>0) return SPELL_NEGATIVE_ENERGY_BURST; else if (GetHasSpell(SPELL_MASS_BLINDNESS_AND_DEAFNESS,oNPC)>0) return SPELL_MASS_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_INCENDIARY_CLOUD,oNPC)>0&&fD>9.9) return SPELL_INCENDIARY_CLOUD; else if (GetHasSpell(SPELL_INFERNO,oNPC)>0) return SPELL_INFERNO; else if (GetHasSpell(SPELL_IMPLOSION,oNPC)>0&&fD>9.9) return SPELL_IMPLOSION; else if (GetHasSpell(SPELL_ICE_STORM,oNPC)>0&&fD>9.9) return SPELL_ICE_STORM; else if (GetHasSpell(SPELL_GREAT_THUNDERCLAP,oNPC)>0) return SPELL_GREAT_THUNDERCLAP; else if (GetHasSpell(SPELL_WEIRD,oNPC)>0) return SPELL_WEIRD; else if (GetHasSpell(SPELL_WORD_OF_FAITH,oNPC)>0) return SPELL_WORD_OF_FAITH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FIRE_STORM,oNPC)>0&&fD>9.9) return SPELL_FIRE_STORM; else if (GetHasSpell(SPELL_EARTHQUAKE,oNPC)>0) return SPELL_EARTHQUAKE; else if (GetHasSpell(SPELL_DELAYED_BLAST_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_DELAYED_BLAST_FIREBALL; else if (GetHasSpell(SPELL_DESTRUCTION,oNPC)>0) return SPELL_DESTRUCTION; else if (GetHasSpell(SPELL_CREEPING_DOOM,oNPC)>0) return SPELL_CREEPING_DOOM; else if (GetHasSpell(SPELL_CRUMBLE,oNPC)>0) return SPELL_CRUMBLE; else if (GetHasSpell(SPELL_CLOUDKILL,oNPC)>0&&fD>9.9) return SPELL_CLOUDKILL; else if (GetHasSpell(SPELL_CONE_OF_COLD,oNPC)>0) return SPELL_CONE_OF_COLD; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oNPC)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_BLADE_BARRIER,oNPC)>0) return SPELL_BLADE_BARRIER; else if (GetHasSpell(SPELL_BALL_LIGHTNING,oNPC)>0) return SPELL_BALL_LIGHTNING; else if (GetHasSpell(SPELL_CLOUD_OF_BEWILDERMENT,oNPC)>0&&fD>9.9&&GetIsImmune(oTarget,IMMUNITY_TYPE_CONFUSED,oMe)==FALSE) return SPELL_CLOUD_OF_BEWILDERMENT; else if (GetHasSpell(SPELL_DARKNESS,oNPC)>0) return SPELL_DARKNESS; else if (GetHasSpell(SPELL_DIRGE,oNPC)>0) return SPELL_DIRGE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_EVARDS_BLACK_TENTACLES,oNPC)>0) return SPELL_EVARDS_BLACK_TENTACLES; else if (GetHasSpell(SPELL_FEAR,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_FEAR,oMe)==FALSE) return SPELL_FEAR; else if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_FLYING_DEBRIS,oNPC)>0) return SPELL_FLYING_DEBRIS; else if (GetHasSpell(SPELL_GREASE,oNPC)>0) return SPELL_GREASE; else if (GetHasSpell(SPELL_HAMMER_OF_THE_GODS,oNPC)>0) return SPELL_HAMMER_OF_THE_GODS; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SPIKE_GROWTH,oNPC)>0) return SPELL_SPIKE_GROWTH; else if (GetHasSpell(SPELL_STINKING_CLOUD,oNPC)>0&&fD>9.9) return SPELL_STINKING_CLOUD; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // high } // okay to do area attack if (bGroup==FALSE&&!bAlliesNear) { // use non-area unless needed if (fCR<6.1) { // low if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_BESTOW_CURSE,oNPC)>0&&d4()<3) return SPELL_BESTOW_CURSE; else if (GetHasSpell(SPELL_BANE,oNPC)>0&&GetHasSpellEffect(SPELL_BANE,oTarget)==FALSE) return SPELL_BANE; else if (GetHasSpell(SPELL_BLINDNESS_AND_DEAFNESS,oNPC)>0&&d4()<3) return SPELL_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_INFLICT_MODERATE_WOUNDS,oNPC)>0) return SPELL_INFLICT_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_RAY_OF_ENFEEBLEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_RAY_OF_ENFEEBLEMENT,oTarget)==FALSE) return SPELL_RAY_OF_ENFEEBLEMENT; else if (GetHasSpell(SPELL_DAZE,oNPC)>0&&d4()<3) return SPELL_DAZE; else if (GetHasSpell(SPELL_CHARM_PERSON_OR_ANIMAL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON||nCT==CAI_CHARM_ANIMAL)&&GetHasSpellEffect(SPELL_CHARM_PERSON_OR_ANIMAL,oTarget)==FALSE) return SPELL_CHARM_PERSON_OR_ANIMAL; else if (GetHasSpell(SPELL_CHARM_PERSON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON)&&GetHasSpellEffect(SPELL_CHARM_PERSON,oTarget)==FALSE) return SPELL_CHARM_PERSON; else if (GetHasSpell(SPELL_CHARM_MONSTER,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_MONSTER)&&GetHasSpellEffect(SPELL_CHARM_MONSTER,oTarget)==FALSE) return SPELL_CHARM_MONSTER; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_GHOUL_TOUCH,oNPC)>0&&d4()<3) return SPELL_GHOUL_TOUCH; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_NEGATIVE_ENERGY_RAY,oNPC)>0) return SPELL_NEGATIVE_ENERGY_RAY; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_VAMPIRIC_TOUCH,oNPC)>0&&d4()<3) return SPELL_VAMPIRIC_TOUCH; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGIC_MISSILE,oNPC)>0) return SPELL_SHADOW_CONJURATION_MAGIC_MISSILE; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_INFLICT_SERIOUS_WOUNDS,oNPC)>0) return SPELL_INFLICT_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_CRITICAL_WOUNDS,oNPC)>0) return SPELL_INFLICT_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_LIGHT_WOUNDS,oNPC)>0) return SPELL_INFLICT_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_MINOR_WOUNDS,oNPC)>0) return SPELL_INFLICT_MINOR_WOUNDS; else if (GetHasSpell(SPELL_POISON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_POISON,oMe)==FALSE) return SPELL_POISON; else if (GetHasSpell(SPELL_TASHAS_HIDEOUS_LAUGHTER,oNPC)>0) return SPELL_TASHAS_HIDEOUS_LAUGHTER; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW; if (GetHasSpell(SPELL_SLEEP,oNPC)>0&&nRT!=RACIAL_TYPE_ELF&&nRT!=RACIAL_TYPE_CONSTRUCT) return SPELL_SLEEP; else if (GetHasSpell(SPELL_SCARE,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_FEAR,oMe)==FALSE) return SPELL_SCARE; else if (GetHasSpell(SPELL_STINKING_CLOUD,oNPC)>0&&fD>9.9) return SPELL_STINKING_CLOUD; else if (GetHasSpell(SPELL_SPIKE_GROWTH,oNPC)>0&&fD>9.9) return SPELL_SPIKE_GROWTH; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_FEAR,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_FEAR,oMe)==FALSE) return SPELL_FEAR; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_CLOUD_OF_BEWILDERMENT,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CONFUSED,oMe)==FALSE) return SPELL_CLOUD_OF_BEWILDERMENT; else if (GetHasSpell(SPELL_GREASE,oNPC)>0) return SPELL_GREASE; else if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // low else { // high if (GetHasSpell(SPELL_POWER_WORD_KILL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_POWER_WORD_KILL; else if (GetHasSpell(SPELL_SLAY_LIVING,oNPC)>0&&d4()<3&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_SLAY_LIVING; else if (GetHasSpell(SPELL_SILENCE,oNPC)>0&&d4()<2) return SPELL_SILENCE; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_HORRID_WILTING,oNPC)>0) return SPELL_HORRID_WILTING; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_FINGER_OF_DEATH,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_FINGER_OF_DEATH; else if (GetHasSpell(SPELL_BIGBYS_CRUSHING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_CRUSHING_HAND; else if (GetHasSpell(SPELL_BIGBYS_CLENCHED_FIST,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_CLENCHED_FIST,oTarget)==FALSE) return SPELL_BIGBYS_CLENCHED_FIST; else if (GetHasSpell(SPELL_BIGBYS_GRASPING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_GRASPING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_GRASPING_HAND; else if (GetHasSpell(SPELL_BIGBYS_FORCEFUL_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_FORCEFUL_HAND,oTarget)==FALSE) return SPELL_BIGBYS_FORCEFUL_HAND; else if (GetHasSpell(SPELL_BIGBYS_INTERPOSING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_INTERPOSING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_INTERPOSING_HAND; else if (GetHasSpell(SPELL_DROWN,oNPC)>0) return SPELL_DROWN; else if (GetHasSpell(SPELL_BANISHMENT,oNPC)>0&&nRT==RACIAL_TYPE_OUTSIDER&&d4()<3) return SPELL_BANISHMENT; else if (GetHasSpell(SPELL_DISMISSAL,oNPC)>0&&nRT==RACIAL_TYPE_OUTSIDER&&d4()<3) return SPELL_DISMISSAL; else if (GetHasSpell(SPELL_ENERGY_DRAIN,oNPC)>0) return SPELL_ENERGY_DRAIN; else if (GetHasSpell(SPELL_PHANTASMAL_KILLER,oNPC)>0) return SPELL_PHANTASMAL_KILLER; else if (GetHasSpell(SPELL_ENERVATION,oNPC)>0) return SPELL_ENERVATION; else if (GetHasSpell(SPELL_FIREBRAND,oNPC)>0) return SPELL_FIREBRAND; else if (GetHasSpell(SPELL_INFESTATION_OF_MAGGOTS,oNPC)>0&&GetHasSpellEffect(SPELL_INFESTATION_OF_MAGGOTS,oTarget)==FALSE&&GetIsImmune(oTarget,IMMUNITY_TYPE_DISEASE,oMe)==FALSE) return SPELL_INFESTATION_OF_MAGGOTS; else if (GetHasSpell(SPELL_CONTAGION,oNPC)>0&&GetHasSpellEffect(SPELL_CONTAGION,oTarget)==FALSE&&GetIsImmune(oTarget,IMMUNITY_TYPE_DISEASE,oMe)==FALSE) return SPELL_CONTAGION; else if (GetHasSpell(SPELL_DOMINATE_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_DOMINATE_PERSON; else if (GetHasSpell(SPELL_CHARM_PERSON_OR_ANIMAL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON||nCT==CAI_CHARM_ANIMAL)&&GetHasSpellEffect(SPELL_CHARM_PERSON_OR_ANIMAL,oTarget)==FALSE) return SPELL_CHARM_PERSON_OR_ANIMAL; else if (GetHasSpell(SPELL_CHARM_PERSON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON)&&GetHasSpellEffect(SPELL_CHARM_PERSON,oTarget)==FALSE) return SPELL_CHARM_PERSON; else if (GetHasSpell(SPELL_CHARM_MONSTER,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_MONSTER)&&GetHasSpellEffect(SPELL_CHARM_MONSTER,oTarget)==FALSE) return SPELL_CHARM_MONSTER; else if (GetHasSpell(SPELL_CONFUSION,oNPC)>0&&GetHasSpellEffect(SPELL_CONFUSION,oTarget)==FALSE&&GetIsImmune(oTarget,IMMUNITY_TYPE_CONFUSED,oMe)==FALSE) return SPELL_CONFUSION; else if (GetHasSpell(SPELL_HOLD_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_HOLD_PERSON; else if (GetHasSpell(SPELL_HARM,oNPC)>0) return SPELL_HARM; else if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_BESTOW_CURSE,oNPC)>0&&d4()<3) return SPELL_BESTOW_CURSE; else if (GetHasSpell(SPELL_BLINDNESS_AND_DEAFNESS,oNPC)>0&&d4()<3) return SPELL_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_INFLICT_MODERATE_WOUNDS,oNPC)>0) return SPELL_INFLICT_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_DAZE,oNPC)>0&&d4()<3&&GetIsImmune(oTarget,IMMUNITY_TYPE_DAZED,oMe)==FALSE) return SPELL_DAZE; else if (GetHasSpell(SPELL_CHARM_PERSON_OR_ANIMAL,oNPC)>0&&d4()<2) return SPELL_CHARM_PERSON_OR_ANIMAL; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_GHOUL_TOUCH,oNPC)>0&&d4()<3) return SPELL_GHOUL_TOUCH; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW; else if (GetHasSpell(SPELL_NEGATIVE_ENERGY_RAY,oNPC)>0) return SPELL_NEGATIVE_ENERGY_RAY; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGIC_MISSILE,oNPC)>0) return SPELL_SHADOW_CONJURATION_MAGIC_MISSILE; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_VAMPIRIC_TOUCH,oNPC)>0&&d4()<3) return SPELL_VAMPIRIC_TOUCH; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_INFLICT_SERIOUS_WOUNDS,oNPC)>0) return SPELL_INFLICT_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_CRITICAL_WOUNDS,oNPC)>0) return SPELL_INFLICT_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_LIGHT_WOUNDS,oNPC)>0) return SPELL_INFLICT_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_MINOR_WOUNDS,oNPC)>0) return SPELL_INFLICT_MINOR_WOUNDS; else if (GetHasSpell(SPELL_POISON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_POISON,oMe)==FALSE) return SPELL_POISON; if (GetHasSpell(SPELL_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_FIREBALL; else if (GetHasSpell(SPELL_SHADES_FIREBALL,oNPC)>0&&fD>9.9) return SPELL_SHADES_FIREBALL; else if (GetHasSpell(SPELL_SCINTILLATING_SPHERE,oNPC)>0) return SPELL_SCINTILLATING_SPHERE; else if (GetHasSpell(SPELL_HAMMER_OF_THE_GODS,oNPC)>0) return SPELL_HAMMER_OF_THE_GODS; else if (GetHasSpell(SPELL_STINKING_CLOUD,oNPC)>0&&fD>9.9) return SPELL_STINKING_CLOUD; else if (GetHasSpell(SPELL_WALL_OF_FIRE,oNPC)>0&&fD>9.9) return SPELL_WALL_OF_FIRE; else if (GetHasSpell(SPELL_CONE_OF_COLD,oNPC)>0) return SPELL_CONE_OF_COLD; else if (GetHasSpell(SPELL_CLOUDKILL,oNPC)>0&&fD>9.9) return SPELL_CLOUDKILL; else if (GetHasSpell(SPELL_WEIRD,oNPC)>0) return SPELL_WEIRD; else if (GetHasSpell(SPELL_ACID_FOG,oNPC)>0) return SPELL_ACID_FOG; else if (GetHasSpell(SPELL_FEAR,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_FEAR,oMe)==FALSE) return SPELL_FEAR; else if (GetHasSpell(SPELL_WORD_OF_FAITH,oNPC)>0) return SPELL_WORD_OF_FAITH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_CLOUD_OF_BEWILDERMENT,oNPC)>0&&fD>9.9&&GetIsImmune(oTarget,IMMUNITY_TYPE_CONFUSED,oMe)==FALSE) return SPELL_CLOUD_OF_BEWILDERMENT; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oNPC)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_ENTANGLE,oNPC)>0) return SPELL_ENTANGLE; else if (GetHasSpell(SPELL_EVARDS_BLACK_TENTACLES,oNPC)>0) return SPELL_EVARDS_BLACK_TENTACLES; else if (GetHasSpell(SPELL_WEB,oNPC)>0) return SPELL_WEB; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_WEB,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_WEB; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_DARKNESS,oNPC)>0) return SPELL_SHADOW_CONJURATION_DARKNESS; } // high } // use non-area unless needed if (fCR<6.1) { // low if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_BESTOW_CURSE,oNPC)>0&&d4()<3) return SPELL_BESTOW_CURSE; else if (GetHasSpell(SPELL_BLINDNESS_AND_DEAFNESS,oNPC)>0&&d4()<3) return SPELL_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_BANE,oNPC)>0&&GetHasSpellEffect(SPELL_BANE,oTarget)==FALSE) return SPELL_BANE; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_INFLICT_MODERATE_WOUNDS,oNPC)>0) return SPELL_INFLICT_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_RAY_OF_ENFEEBLEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_RAY_OF_ENFEEBLEMENT,oTarget)==FALSE) return SPELL_RAY_OF_ENFEEBLEMENT; else if (GetHasSpell(SPELL_DAZE,oNPC)>0&&d4()<3&&GetIsImmune(oTarget,IMMUNITY_TYPE_DAZED,oMe)==FALSE) return SPELL_DAZE; else if (GetHasSpell(SPELL_CHARM_PERSON_OR_ANIMAL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON||nCT==CAI_CHARM_ANIMAL)&&GetHasSpellEffect(SPELL_CHARM_PERSON_OR_ANIMAL,oTarget)==FALSE) return SPELL_CHARM_PERSON_OR_ANIMAL; else if (GetHasSpell(SPELL_CHARM_PERSON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON)&&GetHasSpellEffect(SPELL_CHARM_PERSON,oTarget)==FALSE) return SPELL_CHARM_PERSON; else if (GetHasSpell(SPELL_CHARM_MONSTER,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_MONSTER)&&GetHasSpellEffect(SPELL_CHARM_MONSTER,oTarget)==FALSE) return SPELL_CHARM_MONSTER; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_GHOUL_TOUCH,oNPC)>0&&d4()<3) return SPELL_GHOUL_TOUCH; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW; else if (GetHasSpell(SPELL_NEGATIVE_ENERGY_RAY,oNPC)>0) return SPELL_NEGATIVE_ENERGY_RAY; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_VAMPIRIC_TOUCH,oNPC)>0&&d4()<3) return SPELL_VAMPIRIC_TOUCH; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGIC_MISSILE,oNPC)>0) return SPELL_SHADOW_CONJURATION_MAGIC_MISSILE; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_INFLICT_SERIOUS_WOUNDS,oNPC)>0) return SPELL_INFLICT_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_CRITICAL_WOUNDS,oNPC)>0) return SPELL_INFLICT_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_LIGHT_WOUNDS,oNPC)>0) return SPELL_INFLICT_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_MINOR_WOUNDS,oNPC)>0) return SPELL_INFLICT_MINOR_WOUNDS; else if (GetHasSpell(SPELL_POISON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_POISON,oMe)==FALSE) return SPELL_POISON; else if (GetHasSpell(SPELL_TASHAS_HIDEOUS_LAUGHTER,oNPC)>0) return SPELL_TASHAS_HIDEOUS_LAUGHTER; } // low else { if (GetHasSpell(SPELL_POWER_WORD_KILL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_POWER_WORD_KILL; else if (GetHasSpell(SPELL_SLAY_LIVING,oNPC)>0&&d4()<3&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_SLAY_LIVING; else if (GetHasSpell(SPELL_SILENCE,oNPC)>0&&d4()<2) return SPELL_SILENCE; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_HORRID_WILTING,oNPC)>0) return SPELL_HORRID_WILTING; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_FINGER_OF_DEATH,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_DEATH,oMe)==FALSE) return SPELL_FINGER_OF_DEATH; else if (GetHasSpell(SPELL_BIGBYS_CRUSHING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_CRUSHING_HAND; else if (GetHasSpell(SPELL_BIGBYS_CLENCHED_FIST,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_CLENCHED_FIST,oTarget)==FALSE) return SPELL_BIGBYS_CLENCHED_FIST; else if (GetHasSpell(SPELL_BIGBYS_GRASPING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_GRASPING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_GRASPING_HAND; else if (GetHasSpell(SPELL_BIGBYS_FORCEFUL_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_FORCEFUL_HAND,oTarget)==FALSE) return SPELL_BIGBYS_FORCEFUL_HAND; else if (GetHasSpell(SPELL_BIGBYS_INTERPOSING_HAND,oNPC)>0&&GetHasSpellEffect(SPELL_BIGBYS_INTERPOSING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_INTERPOSING_HAND; else if (GetHasSpell(SPELL_FEEBLEMIND,oNPC)>0&&GetHasSpellEffect(SPELL_FEEBLEMIND,oTarget)==FALSE) return SPELL_FEEBLEMIND; else if (GetHasSpell(SPELL_DROWN,oNPC)>0) return SPELL_DROWN; else if (GetHasSpell(SPELL_BANISHMENT,oNPC)>0&&nRT==RACIAL_TYPE_OUTSIDER&&d4()<3) return SPELL_BANISHMENT; else if (GetHasSpell(SPELL_DISMISSAL,oNPC)>0&&nRT==RACIAL_TYPE_OUTSIDER&&d4()<3) return SPELL_DISMISSAL; else if (GetHasSpell(SPELL_ENERGY_DRAIN,oNPC)>0) return SPELL_ENERGY_DRAIN; else if (GetHasSpell(SPELL_PHANTASMAL_KILLER,oNPC)>0) return SPELL_PHANTASMAL_KILLER; else if (GetHasSpell(SPELL_ENERVATION,oNPC)>0) return SPELL_ENERVATION; else if (GetHasSpell(SPELL_FIREBRAND,oNPC)>0) return SPELL_FIREBRAND; else if (GetHasSpell(SPELL_INFESTATION_OF_MAGGOTS,oNPC)>0&&GetHasSpellEffect(SPELL_INFESTATION_OF_MAGGOTS,oTarget)==FALSE&&GetIsImmune(oTarget,IMMUNITY_TYPE_DISEASE,oMe)==FALSE) return SPELL_INFESTATION_OF_MAGGOTS; else if (GetHasSpell(SPELL_CONTAGION,oNPC)>0&&GetHasSpellEffect(SPELL_CONTAGION,oTarget)==FALSE&&GetIsImmune(oTarget,IMMUNITY_TYPE_DISEASE,oMe)==FALSE) return SPELL_CONTAGION; else if (GetHasSpell(SPELL_DOMINATE_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_DOMINATE_PERSON; else if (GetHasSpell(SPELL_CONFUSION,oNPC)>0&&GetHasSpellEffect(SPELL_CONFUSION,oTarget)==FALSE&&GetIsImmune(oTarget,IMMUNITY_TYPE_CONFUSED,oMe)==FALSE) return SPELL_CONFUSION; else if (GetHasSpell(SPELL_HOLD_PERSON,oNPC)>0&&GetIsPC(oTarget)&&GetHasSpellEffect(SPELL_DOMINATE_PERSON,oTarget)==FALSE) return SPELL_HOLD_PERSON; else if (GetHasSpell(SPELL_HARM,oNPC)>0) return SPELL_HARM; else if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oNPC)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_DOOM,oNPC)>0&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oNPC)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_BESTOW_CURSE,oNPC)>0&&d4()<3) return SPELL_BESTOW_CURSE; else if (GetHasSpell(SPELL_BLINDNESS_AND_DEAFNESS,oNPC)>0&&d4()<3) return SPELL_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_BOMBARDMENT,oNPC)>0) return SPELL_BOMBARDMENT; else if (GetHasSpell(SPELL_CHARM_PERSON_OR_ANIMAL,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON||nCT==CAI_CHARM_ANIMAL)&&GetHasSpellEffect(SPELL_CHARM_PERSON_OR_ANIMAL,oTarget)==FALSE) return SPELL_CHARM_PERSON_OR_ANIMAL; else if (GetHasSpell(SPELL_CHARM_PERSON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_PERSON)&&GetHasSpellEffect(SPELL_CHARM_PERSON,oTarget)==FALSE) return SPELL_CHARM_PERSON; else if (GetHasSpell(SPELL_CHARM_MONSTER,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_CHARM,oMe)==FALSE&&(nCT==CAI_CHARM_MONSTER)&&GetHasSpellEffect(SPELL_CHARM_MONSTER,oTarget)==FALSE) return SPELL_CHARM_MONSTER; else if (GetHasSpell(SPELL_BURNING_HANDS,oNPC)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_CALL_LIGHTNING,oNPC)>0) return SPELL_CALL_LIGHTNING; else if (GetHasSpell(SPELL_INFLICT_MODERATE_WOUNDS,oNPC)>0) return SPELL_INFLICT_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_DAZE,oNPC)>0&&d4()<3&&GetIsImmune(oTarget,IMMUNITY_TYPE_DAZED,oMe)==FALSE) return SPELL_DAZE; else if (GetHasSpell(SPELL_CHARM_PERSON_OR_ANIMAL,oNPC)>0&&d4()<2) return SPELL_CHARM_PERSON_OR_ANIMAL; else if (GetHasSpell(SPELL_FLAME_LASH,oNPC)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_FLAME_STRIKE,oNPC)>0) return SPELL_FLAME_STRIKE; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oNPC)>0) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_GHOUL_TOUCH,oNPC)>0&&d4()<3) return SPELL_GHOUL_TOUCH; else if (GetHasSpell(SPELL_ICE_DAGGER,oNPC)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oNPC)>0) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oNPC)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW,oNPC)>0) return SPELL_GREATER_SHADOW_CONJURATION_ACID_ARROW; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGIC_MISSILE,oNPC)>0) return SPELL_SHADOW_CONJURATION_MAGIC_MISSILE; else if (GetHasSpell(SPELL_NEGATIVE_ENERGY_RAY,oNPC)>0) return SPELL_NEGATIVE_ENERGY_RAY; else if (GetHasSpell(SPELL_QUILLFIRE,oNPC)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oNPC)>0&&d4()<4) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_SEARING_LIGHT,oNPC)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SOUND_BURST,oNPC)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_SLOW,oNPC)>0&&d4()<3) return SPELL_SLOW; else if (GetHasSpell(SPELL_SUNBEAM,oNPC)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_VAMPIRIC_TOUCH,oNPC)>0&&d4()<3) return SPELL_VAMPIRIC_TOUCH; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oNPC)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oNPC)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_FLAME_ARROW,oNPC)>0) return SPELL_FLAME_ARROW; else if (GetHasSpell(SPELL_COLOR_SPRAY,oNPC)>0) return SPELL_COLOR_SPRAY; else if (GetHasSpell(SPELL_ACID_SPLASH,oNPC)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_INFLICT_SERIOUS_WOUNDS,oNPC)>0) return SPELL_INFLICT_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_CRITICAL_WOUNDS,oNPC)>0) return SPELL_INFLICT_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_LIGHT_WOUNDS,oNPC)>0) return SPELL_INFLICT_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_INFLICT_MINOR_WOUNDS,oNPC)>0) return SPELL_INFLICT_MINOR_WOUNDS; else if (GetHasSpell(SPELL_POISON,oNPC)>0&&GetIsImmune(oTarget,IMMUNITY_TYPE_POISON,oMe)==FALSE) return SPELL_POISON; else if (GetHasSpell(SPELL_WEIRD,oNPC)>0) return SPELL_WEIRD; } // high } // not undead enemies return 0; } // caiGetAvailableCombatSpell() int caiGetAvailableDefensiveSpell(object oNPC,object oTarget) { // PURPOSE: To return a defensive spell that oNPC has that is useful to oTarget. int bSC=GetLocalInt(oNPC,"bCAISPELLCASTERS"); if (oNPC==oTarget) { // self if(GetHasSpell(SPELL_ETHEREAL_VISAGE,oNPC)>0&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oTarget)==FALSE) return SPELL_ETHEREAL_VISAGE; else if(GetHasSpell(SPELL_PREMONITION,oNPC)>0&&GetHasSpellEffect(SPELL_PREMONITION,oTarget)==FALSE) return SPELL_PREMONITION; else if(GetHasSpell(SPELL_GREATER_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oTarget)==FALSE) return SPELL_GREATER_STONESKIN; else if(GetHasSpell(SPELL_GREATER_SPELL_MANTLE,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oTarget)==FALSE&&bSC) return SPELL_GREATER_SPELL_MANTLE; else if(GetHasSpell(SPELL_EPIC_MAGE_ARMOR,oNPC)>0&&GetHasSpellEffect(SPELL_EPIC_MAGE_ARMOR,oTarget)==FALSE) return SPELL_EPIC_MAGE_ARMOR; else if(GetHasSpell(SPELL_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_STONESKIN,oTarget)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oTarget)==FALSE) return SPELL_STONESKIN; else if(GetHasSpell(SPELL_SPELL_MANTLE,oNPC)>0&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oTarget)==FALSE&&bSC&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oTarget)==FALSE) return SPELL_SPELL_MANTLE; else if(GetHasSpell(SPELL_DEATH_WARD,oNPC)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oTarget)==FALSE) return SPELL_DEATH_WARD; else if(GetHasSpell(SPELL_GHOSTLY_VISAGE,oNPC)>0&&GetHasSpellEffect(SPELL_GHOSTLY_VISAGE,oTarget)==FALSE&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oTarget)==FALSE) return SPELL_GHOSTLY_VISAGE; else if(GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY,oNPC)>0&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oTarget)==FALSE&&bSC) return SPELL_GLOBE_OF_INVULNERABILITY; else if(GetHasSpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oNPC)>0&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oTarget)==FALSE&&bSC&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oTarget)==FALSE) return SPELL_MINOR_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_CLOAK_OF_CHAOS,oNPC)>0&&GetHasSpellEffect(SPELL_CLOAK_OF_CHAOS,oTarget)==FALSE) return SPELL_CLOAK_OF_CHAOS; else if(GetHasSpell(SPELL_NEGATIVE_ENERGY_PROTECTION,oNPC)>0&&GetHasSpellEffect(SPELL_NEGATIVE_ENERGY_PROTECTION,oTarget)==FALSE) return SPELL_NEGATIVE_ENERGY_PROTECTION; else if(GetHasSpell(SPELL_MIND_BLANK,oNPC)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oTarget)==FALSE&&bSC) return SPELL_MIND_BLANK; else if(GetHasSpell(SPELL_LESSER_MIND_BLANK,oNPC)>0&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oTarget)==FALSE&&bSC&&GetHasSpellEffect(SPELL_MIND_BLANK,oTarget)==FALSE) return SPELL_LESSER_MIND_BLANK; else if(GetHasSpell(SPELL_TRUE_SEEING,oNPC)>0&&GetHasSpellEffect(SPELL_TRUE_SEEING,oTarget)==FALSE&&bSC) return SPELL_TRUE_SEEING; else if(GetHasSpell(SPELL_SEE_INVISIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oTarget)==FALSE&&GetHasSpellEffect(SPELL_TRUE_SEEING,oTarget)==FALSE) return SPELL_SEE_INVISIBILITY; else if(GetHasSpell(SPELL_FREEDOM_OF_MOVEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT,oTarget)==FALSE&&bSC) return SPELL_FREEDOM_OF_MOVEMENT; else if(GetHasSpell(SPELL_PRAYER,oNPC)>0&&GetHasSpellEffect(SPELL_PRAYER,oTarget)==FALSE) return SPELL_PRAYER; else if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oTarget)==FALSE) return SPELL_IMPROVED_INVISIBILITY; else if(GetHasSpell(SPELL_INVISIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_INVISIBILITY,oTarget)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oTarget)==FALSE) return SPELL_INVISIBILITY; else if(GetHasSpell(SPELL_LESSER_SPELL_MANTLE,oNPC)>0&&GetHasSpellEffect(SPELL_LESSER_SPELL_MANTLE,oTarget)==FALSE&&bSC&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oTarget)==FALSE&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oTarget)==FALSE) return SPELL_LESSER_SPELL_MANTLE; else if(GetHasSpell(SPELL_DISPLACEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_DISPLACEMENT,oTarget)==FALSE) return SPELL_DISPLACEMENT; else if(GetHasSpell(SPELL_ELEMENTAL_SHIELD,oNPC)>0&&GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD,oTarget)==FALSE) return SPELL_ELEMENTAL_SHIELD; else if(GetHasSpell(SPELL_ENTROPIC_SHIELD,oNPC)>0&&GetHasSpellEffect(SPELL_ENTROPIC_SHIELD,oTarget)==FALSE) return SPELL_ENTROPIC_SHIELD; else if(GetHasSpell(SPELL_SHIELD,oNPC)>0&&GetHasSpellEffect(SPELL_SHIELD,oTarget)==FALSE) return SPELL_SHIELD; else if(GetHasSpell(SPELL_MAGE_ARMOR,oNPC)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oTarget)==FALSE&&GetHasSpellEffect(SPELL_EPIC_MAGE_ARMOR,oTarget)==FALSE) return SPELL_MAGE_ARMOR; else if(GetHasSpell(SPELL_REGENERATE,oNPC)>0&&GetHasSpellEffect(SPELL_REGENERATE,oTarget)==FALSE) return SPELL_REGENERATE; else if(GetHasSpell(SPELL_BARKSKIN,oNPC)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oTarget)==FALSE) return SPELL_BARKSKIN; else if(GetHasSpell(SPELL_SHIELD_OF_FAITH,oNPC)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_FAITH,oTarget)==FALSE) return SPELL_SHIELD_OF_FAITH; else if(GetHasSpell(SPELL_SHIELD_OF_LAW,oNPC)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_LAW,oTarget)==FALSE) return SPELL_SHIELD_OF_LAW; else if(GetHasSpell(SPELL_NEGATIVE_ENERGY_PROTECTION,oNPC)>0&&GetHasSpellEffect(SPELL_NEGATIVE_ENERGY_PROTECTION,oTarget)==FALSE) return SPELL_NEGATIVE_ENERGY_PROTECTION; else if(GetHasSpell(SPELL_ENDURE_ELEMENTS,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oTarget)==FALSE&&bSC) return SPELL_ENDURE_ELEMENTS; else if(GetHasSpell(SPELL_PROTECTION_FROM_EVIL,oNPC)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL,oTarget)==FALSE&&GetAlignmentGoodEvil(oTarget)!=ALIGNMENT_EVIL) return SPELL_PROTECTION_FROM_EVIL; else if(GetHasSpell(SPELL_PROTECTION_FROM_GOOD,oNPC)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_GOOD,oTarget)==FALSE&&GetAlignmentGoodEvil(oTarget)!=ALIGNMENT_GOOD) return SPELL_PROTECTION_FROM_GOOD; else if(GetHasSpell(SPELL_MAGIC_CIRCLE_AGAINST_EVIL,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_CIRCLE_AGAINST_EVIL,oTarget)==FALSE&&GetAlignmentGoodEvil(oTarget)!=ALIGNMENT_EVIL) return SPELL_MAGIC_CIRCLE_AGAINST_EVIL; else if(GetHasSpell(SPELL_MAGIC_CIRCLE_AGAINST_GOOD,oNPC)>0&&GetHasSpellEffect(SPELL_MAGIC_CIRCLE_AGAINST_GOOD,oTarget)==FALSE&&GetAlignmentGoodEvil(oTarget)!=ALIGNMENT_GOOD) return SPELL_MAGIC_CIRCLE_AGAINST_GOOD; else if(GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE&&bSC) return SPELL_RESISTANCE; else if(GetHasSpell(SPELL_BLESS,oNPC)>0&&GetHasSpellEffect(SPELL_BLESS,oTarget)==FALSE) return SPELL_BLESS; else if(GetHasSpell(SPELL_IRONGUTS,oNPC)>0&&GetHasSpellEffect(SPELL_IRONGUTS,oTarget)==FALSE) return SPELL_IRONGUTS; else if(GetHasSpell(SPELL_SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_SPELL_RESISTANCE; else if (GetHasSpell(SPELL_CATS_GRACE,oNPC)>0&&GetHasSpellEffect(SPELL_CATS_GRACE,oTarget)==FALSE) return SPELL_CATS_GRACE; else if (GetHasSpell(SPELL_SHADES_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oTarget)==FALSE) return SPELL_SHADES_STONESKIN; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oNPC)>0&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oTarget)==FALSE) return SPELL_SHADOW_CONJURATION_MAGE_ARMOR; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oTarget)==FALSE) return SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oTarget)==FALSE) return SPELL_SHADOW_CONJURATION_INIVSIBILITY; else if (GetHasSpell(SPELL_SHADOW_SHIELD,oNPC)&&bSC&&GetHasSpellEffect(SPELL_SHADOW_SHIELD,oTarget)==FALSE>0) return SPELL_SHADOW_SHIELD; else if(GetHasSpell(SPELL_PROTECTION_FROM_SPELLS,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_PROTECTION_FROM_SPELLS,oTarget)==FALSE) return SPELL_PROTECTION_FROM_SPELLS; } // self else { // other if(GetHasSpell(SPELL_GREATER_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oTarget)==FALSE) return SPELL_GREATER_STONESKIN; else if(GetHasSpell(SPELL_STONESKIN,oNPC)>0&&GetHasSpellEffect(SPELL_STONESKIN,oTarget)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oTarget)==FALSE) return SPELL_STONESKIN; else if(GetHasSpell(SPELL_NEGATIVE_ENERGY_PROTECTION,oNPC)>0&&GetHasSpellEffect(SPELL_NEGATIVE_ENERGY_PROTECTION,oTarget)==FALSE) return SPELL_NEGATIVE_ENERGY_PROTECTION; else if(GetHasSpell(SPELL_MIND_BLANK,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_MIND_BLANK,oTarget)==FALSE) return SPELL_MIND_BLANK; else if(GetHasSpell(SPELL_TRUE_SEEING,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_TRUE_SEEING,oTarget)==FALSE) return SPELL_TRUE_SEEING; else if(GetHasSpell(SPELL_SEE_INVISIBILITY,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oTarget)==FALSE&&GetHasSpellEffect(SPELL_TRUE_SEEING,oTarget)==FALSE) return SPELL_SEE_INVISIBILITY; else if(GetHasSpell(SPELL_FREEDOM_OF_MOVEMENT,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT,oTarget)==FALSE) return SPELL_FREEDOM_OF_MOVEMENT; else if(GetHasSpell(SPELL_IMPROVED_INVISIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oTarget)==FALSE) return SPELL_IMPROVED_INVISIBILITY; else if(GetHasSpell(SPELL_INVISIBILITY,oNPC)>0&&GetHasSpellEffect(SPELL_INVISIBILITY,oTarget)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oTarget)==FALSE) return SPELL_INVISIBILITY; else if(GetHasSpell(SPELL_REGENERATE,oNPC)>0&&GetHasSpellEffect(SPELL_REGENERATE,oTarget)==FALSE) return SPELL_REGENERATE; else if(GetHasSpell(SPELL_BARKSKIN,oNPC)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oTarget)==FALSE) return SPELL_BARKSKIN; else if(GetHasSpell(SPELL_SHIELD_OF_FAITH,oNPC)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_FAITH,oTarget)==FALSE) return SPELL_SHIELD_OF_FAITH; else if(GetHasSpell(SPELL_DEATH_WARD,oNPC)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oTarget)==FALSE) return SPELL_DEATH_WARD; else if(GetHasSpell(SPELL_DISPLACEMENT,oNPC)>0&&GetHasSpellEffect(SPELL_DISPLACEMENT,oTarget)==FALSE) return SPELL_DISPLACEMENT; else if(GetHasSpell(SPELL_ENDURE_ELEMENTS,oNPC)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oTarget)==FALSE) return SPELL_ENDURE_ELEMENTS; else if(GetHasSpell(SPELL_PROTECTION_FROM_EVIL,oNPC)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL,oTarget)==FALSE&&GetAlignmentGoodEvil(oTarget)!=ALIGNMENT_EVIL) return SPELL_PROTECTION_FROM_EVIL; else if(GetHasSpell(SPELL_PROTECTION_FROM_GOOD,oNPC)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_GOOD,oTarget)==FALSE&&GetAlignmentGoodEvil(oTarget)!=ALIGNMENT_GOOD) return SPELL_PROTECTION_FROM_GOOD; else if(GetHasSpell(SPELL_RESIST_ELEMENTS,oNPC)>0&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oTarget)==FALSE) return SPELL_RESIST_ELEMENTS; else if(GetHasSpell(SPELL_RESISTANCE,oNPC)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_RESISTANCE; else if(GetHasSpell(SPELL_BLESS,oNPC)>0&&GetHasSpellEffect(SPELL_BLESS,oTarget)==FALSE) return SPELL_BLESS; else if(GetHasSpell(SPELL_IRONGUTS,oNPC)>0&&GetHasSpellEffect(SPELL_IRONGUTS,oTarget)==FALSE) return SPELL_IRONGUTS; else if(GetHasSpell(SPELL_SPELL_RESISTANCE,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_SPELL_RESISTANCE,oTarget)==FALSE) return SPELL_SPELL_RESISTANCE; else if(GetHasSpell(SPELL_PROTECTION_FROM_SPELLS,oNPC)>0&&bSC&&GetHasSpellEffect(SPELL_PROTECTION_FROM_SPELLS,oTarget)==FALSE) return SPELL_PROTECTION_FROM_SPELLS; } // other return 0; } // caiGetAvailableDefensiveSpell() int caiProfessionalAntiStealth() { // PURPOSE: Return spells to counter invisibility, stealth, etc. object oMe=OBJECT_SELF; if (GetHasSpell(SPELL_TRUE_SEEING,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_SEEING,oMe)==FALSE) return SPELL_TRUE_SEEING; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oMe)==FALSE) return SPELL_SEE_INVISIBILITY; else if (GetHasSpell(SPELL_INVISIBILITY_PURGE,oMe)>0) return SPELL_INVISIBILITY_PURGE; else if (GetHasSpell(SPELL_PREMONITION,oMe)>0&&GetHasSpellEffect(SPELL_PREMONITION,oMe)==FALSE) return SPELL_PREMONITION; else if (GetHasSpell(SPELL_DEATH_WARD,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oMe)==FALSE) return SPELL_DEATH_WARD; else if (GetHasSpell(SPELL_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_MIND_BLANK; else if (GetHasSpell(SPELL_LESSER_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oMe)==FALSE) return SPELL_LESSER_MIND_BLANK; else if (GetHasSpell(SPELL_SANCTUARY,oMe)>0&&GetHasSpellEffect(SPELL_SANCTUARY,oMe)==FALSE) return SPELL_SANCTUARY; return 0; } // caiProfessionalAntiStealth() int caiProfessionalDefensive(object oTarget) { // PURPOSE: Return defensive spells versus specified target object oMe=OBJECT_SELF; int nUND=GetLocalInt(oMe,"nCAICountUND"); int nOUT=GetLocalInt(oMe,"nCAICountOUT"); int nCON=GetLocalInt(oMe,"nCAICountCON"); int nARC=GetLocalInt(oMe,"nCAICountARC"); int nDIV=GetLocalInt(oMe,"nCAICountDIV"); int nDRA=GetLocalInt(oMe,"nCAICountDRA"); int nRGD=GetLocalInt(oMe,"nCAICountRGD"); int nMEL=GetLocalInt(oMe,"nCAICountMEL"); int nRT=GetRacialType(oTarget); object oItem=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oTarget); int nAGE=GetAlignmentGoodEvil(oMe); int nALC=GetAlignmentLawChaos(oMe); if (nDRA>0) { // dragons are near if (GetHasSpell(SPELL_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_MIND_BLANK; else if (GetHasSpell(SPELL_LESSER_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oMe)==FALSE) return SPELL_LESSER_MIND_BLANK; else if (GetHasSpell(SPELL_PREMONITION,oMe)>0&&GetHasSpellEffect(SPELL_PREMONITION,oMe)==FALSE) return SPELL_PREMONITION; else if (GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_RESIST_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oMe)==FALSE&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oMe)==FALSE&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oMe)==FALSE&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; } // dragons are near if (nRGD>0) { // ranged if (GetHasSpell(SPELL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD,oMe)==FALSE) return SPELL_SHIELD; } // ranged if (nARC>0) { // arcane opponents if (GetHasSpell(SPELL_GREATER_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_GREATER_SPELL_MANTLE; else if (GetHasSpell(SPELL_TIME_STOP,oMe)>0&&GetHasSpellEffect(SPELL_TIME_STOP,oMe)==FALSE&&d4()==1) return SPELL_TIME_STOP; else if (GetHasSpell(SPELL_PREMONITION,oMe)>0&&GetHasSpellEffect(SPELL_PREMONITION,oMe)==FALSE) return SPELL_PREMONITION; else if (GetHasSpell(SPELL_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_MIND_BLANK; else if (GetHasSpell(SPELLABILITY_AURA_PROTECTION,oMe)>0&&GetHasSpellEffect(SPELLABILITY_AURA_PROTECTION,oMe)==FALSE) return SPELLABILITY_AURA_PROTECTION; else if (GetHasSpell(SPELL_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_SPELL_MANTLE; else if (GetHasSpell(SPELL_TRUE_SEEING,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_SEEING,oMe)==FALSE) return SPELL_TRUE_SEEING; else if (GetHasSpell(SPELL_SHADOW_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_SHIELD,oMe)==FALSE) return SPELL_SHADOW_SHIELD; else if (GetHasSpell(SPELL_REGENERATE,oMe)>0&&GetHasSpellEffect(SPELL_REGENERATE,oMe)==FALSE) return SPELL_REGENERATE; else if (GetHasSpell(SPELL_AURA_OF_VITALITY,oMe)>0&&GetHasSpellEffect(SPELL_AURA_OF_VITALITY,oMe)==FALSE) return SPELL_AURA_OF_VITALITY; else if (GetHasSpell(SPELL_ETHEREAL_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_ETHEREAL_VISAGE; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_CIRCLE_OF_DEATH,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DEATH,oMe)==FALSE) return SPELL_CIRCLE_OF_DEATH; else if (GetHasSpell(SPELL_SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_SPELL_RESISTANCE,oMe)==FALSE) return SPELL_SPELL_RESISTANCE; else if (GetHasSpell(SPELL_MONSTROUS_REGENERATION,oMe)>0&&GetHasSpellEffect(SPELL_MONSTROUS_REGENERATION,oMe)==FALSE) return SPELL_MONSTROUS_REGENERATION; else if (GetHasSpell(SPELL_LESSER_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_LESSER_SPELL_MANTLE; else if (GetHasSpell(SPELL_LESSER_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oMe)==FALSE&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_LESSER_MIND_BLANK; else if (GetHasSpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_MINOR_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE; else if (GetHasSpell(SPELL_CIRCLE_OF_DOOM,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DOOM,oMe)==FALSE) return SPELL_CIRCLE_OF_DOOM; else if (GetHasSpell(SPELL_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_DEATH_WARD,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oMe)==FALSE) return SPELL_DEATH_WARD; else if (GetHasSpell(SPELL_FREEDOM_OF_MOVEMENT,oMe)>0&&GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT,oMe)==FALSE) return SPELL_FREEDOM_OF_MOVEMENT; else if (GetHasSpell(SPELL_IMPROVED_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_IMPROVED_INVISIBILITY; else if (GetHasSpell(SPELL_MASS_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_MASS_CAMOFLAGE; else if (GetHasSpell(SPELL_DIVINE_POWER,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_POWER,oMe)==FALSE) return SPELL_DIVINE_POWER; else if (GetHasSpell(SPELL_ELEMENTAL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD,oMe)==FALSE) return SPELL_ELEMENTAL_SHIELD; else if (GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_PROTECTION_FROM_ELEMENTS; else if (GetHasSpell(SPELL_PRAYER,oMe)>0&&GetHasSpellEffect(SPELL_PRAYER,oMe)==FALSE) return SPELL_PRAYER; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oMe)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oMe)==FALSE&&d4()<3) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_INVISIBILITY_SPHERE,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY_SPHERE; else if (GetHasSpell(SPELL_HASTE,oMe)>0&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_DISPLACEMENT,oMe)>0&&GetHasSpellEffect(SPELL_DISPLACEMENT,oMe)==FALSE) return SPELL_DISPLACEMENT; else if (GetHasSpell(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)>0&&GetHasSpellEffect(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)==FALSE&&d4()<3) return SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oMe)==FALSE) return SPELL_SEE_INVISIBILITY; else if (GetHasSpell(SPELL_RESIST_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oMe)==FALSE) return SPELL_RESIST_ELEMENTS; else if (GetHasSpell(SPELL_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_INIVSIBILITY; else if (GetHasSpell(SPELL_GHOSTLY_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_GHOSTLY_VISAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_GHOSTLY_VISAGE; else if (GetHasSpell(SPELL_DEATH_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_ARMOR,oMe)==FALSE) return SPELL_DEATH_ARMOR; else if (GetHasSpell(SPELL_SHADES_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_SHADES_STONESKIN; else if (GetHasSpell(SPELL_BARKSKIN,oMe)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_AURAOFGLORY,oMe)>0&&GetHasSpellEffect(SPELL_AURAOFGLORY,oMe)==FALSE) return SPELL_AURAOFGLORY; else if (GetHasSpell(SPELL_AID,oMe)>0&&GetHasSpellEffect(SPELL_AID,oMe)==FALSE) return SPELL_AID; else if (GetHasSpell(SPELL_TRUE_STRIKE,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_STRIKE,oMe)==FALSE) return SPELL_TRUE_STRIKE; else if (GetHasSpell(SPELL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD,oMe)==FALSE) return SPELL_SHIELD; else if (GetHasSpell(SPELL_SHIELD_OF_FAITH,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_FAITH,oMe)==FALSE) return SPELL_SHIELD_OF_FAITH; else if (GetHasSpell(SPELL_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE) return SPELL_MAGE_ARMOR; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_MAGE_ARMOR; else if (GetHasSpell(SPELL_SANCTUARY,oMe)>0&&GetHasSpellEffect(SPELL_SANCTUARY,oMe)==FALSE&&d4()==1) return SPELL_SANCTUARY; else if (GetHasSpell(SPELL_IRONGUTS,oMe)>0&&GetHasSpellEffect(SPELL_IRONGUTS,oMe)==FALSE) return SPELL_IRONGUTS; else if (GetHasSpell(SPELL_EXPEDITIOUS_RETREAT,oMe)>0&&GetHasSpellEffect(SPELL_EXPEDITIOUS_RETREAT,oMe)==FALSE&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_EXPEDITIOUS_RETREAT; else if (GetHasSpell(SPELL_ENTROPIC_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ENTROPIC_SHIELD,oMe)==FALSE) return SPELL_ENTROPIC_SHIELD; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_DIVINE_FAVOR,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_FAVOR,oMe)==FALSE) return SPELL_DIVINE_FAVOR; else if (GetHasSpell(SPELL_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_VINE_MINE_CAMOUFLAGE; else if (GetHasSpell(SPELL_VINE_MINE_CAMOUFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_VINE_MINE_CAMOUFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_CAMOFLAGE; else if (GetHasSpell(SPELL_BLESS_WEAPON,oMe)>0&&GetHasSpellEffect(SPELL_BLESS_WEAPON,oMe)==FALSE) return SPELL_BLESS_WEAPON; else if (GetHasSpell(SPELL_BLESS,oMe)>0&&GetHasSpellEffect(SPELL_BLESS,oMe)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_PROTECTION_FROM_EVIL,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL,oMe)==FALSE&&nAGE!=ALIGNMENT_EVIL) return SPELL_PROTECTION_FROM_EVIL; else if (GetHasSpell(SPELL_PROTECTION_FROM_GOOD,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_GOOD,oMe)==FALSE&&nAGE!=ALIGNMENT_GOOD) return SPELL_PROTECTION_FROM_GOOD; else if (GetHasSpell(SPELL_PROTECTION_FROM_LAW,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_LAW,oMe)==FALSE&&nALC!=ALIGNMENT_LAWFUL) return SPELL_PROTECTION_FROM_LAW; else if (GetHasSpell(SPELL_PROTECTION__FROM_CHAOS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION__FROM_CHAOS,oMe)==FALSE&&nALC!=ALIGNMENT_CHAOTIC) return SPELL_PROTECTION__FROM_CHAOS; else if (GetHasSpell(SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oMe)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_VIRTUE,oMe)>0&&GetHasSpellEffect(SPELL_VIRTUE,oMe)==FALSE) return SPELL_VIRTUE; else if (GetHasSpell(SPELL_PROTECTION_FROM_SPELLS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_SPELLS,oMe)==FALSE) return SPELL_PROTECTION_FROM_SPELLS; } // arcane opponents if (nDIV>0) { // divine opponents if (GetHasSpell(SPELL_GREATER_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_GREATER_SPELL_MANTLE; else if (GetHasSpell(SPELL_TIME_STOP,oMe)>0&&GetHasSpellEffect(SPELL_TIME_STOP,oMe)==FALSE&&d4()==1) return SPELL_TIME_STOP; else if (GetHasSpell(SPELL_PREMONITION,oMe)>0&&GetHasSpellEffect(SPELL_PREMONITION,oMe)==FALSE) return SPELL_PREMONITION; else if (GetHasSpell(SPELL_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_MIND_BLANK; else if (GetHasSpell(SPELLABILITY_AURA_PROTECTION,oMe)>0&&GetHasSpellEffect(SPELLABILITY_AURA_PROTECTION,oMe)==FALSE) return SPELLABILITY_AURA_PROTECTION; else if (GetHasSpell(SPELL_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_SPELL_MANTLE; else if (GetHasSpell(SPELL_TRUE_SEEING,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_SEEING,oMe)==FALSE) return SPELL_TRUE_SEEING; else if (GetHasSpell(SPELL_SHADOW_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_SHIELD,oMe)==FALSE) return SPELL_SHADOW_SHIELD; else if (GetHasSpell(SPELL_REGENERATE,oMe)>0&&GetHasSpellEffect(SPELL_REGENERATE,oMe)==FALSE) return SPELL_REGENERATE; else if (GetHasSpell(SPELL_AURA_OF_VITALITY,oMe)>0&&GetHasSpellEffect(SPELL_AURA_OF_VITALITY,oMe)==FALSE) return SPELL_AURA_OF_VITALITY; else if (GetHasSpell(SPELL_ETHEREAL_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_ETHEREAL_VISAGE; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_CIRCLE_OF_DEATH,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DEATH,oMe)==FALSE) return SPELL_CIRCLE_OF_DEATH; else if (GetHasSpell(SPELL_SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_SPELL_RESISTANCE,oMe)==FALSE) return SPELL_SPELL_RESISTANCE; else if (GetHasSpell(SPELL_MONSTROUS_REGENERATION,oMe)>0&&GetHasSpellEffect(SPELL_MONSTROUS_REGENERATION,oMe)==FALSE) return SPELL_MONSTROUS_REGENERATION; else if (GetHasSpell(SPELL_LESSER_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_LESSER_SPELL_MANTLE; else if (GetHasSpell(SPELL_LESSER_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oMe)==FALSE&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_LESSER_MIND_BLANK; else if (GetHasSpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_MINOR_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE; else if (GetHasSpell(SPELL_CIRCLE_OF_DOOM,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DOOM,oMe)==FALSE) return SPELL_CIRCLE_OF_DOOM; else if (GetHasSpell(SPELL_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_DEATH_WARD,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oMe)==FALSE) return SPELL_DEATH_WARD; else if (GetHasSpell(SPELL_FREEDOM_OF_MOVEMENT,oMe)>0&&GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT,oMe)==FALSE) return SPELL_FREEDOM_OF_MOVEMENT; else if (GetHasSpell(SPELL_IMPROVED_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_IMPROVED_INVISIBILITY; else if (GetHasSpell(SPELL_MASS_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_MASS_CAMOFLAGE; else if (GetHasSpell(SPELL_DIVINE_POWER,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_POWER,oMe)==FALSE) return SPELL_DIVINE_POWER; else if (GetHasSpell(SPELL_ELEMENTAL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD,oMe)==FALSE) return SPELL_ELEMENTAL_SHIELD; else if (GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_PROTECTION_FROM_ELEMENTS; else if (GetHasSpell(SPELL_PRAYER,oMe)>0&&GetHasSpellEffect(SPELL_PRAYER,oMe)==FALSE) return SPELL_PRAYER; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oMe)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oMe)==FALSE&&d4()<3) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_INVISIBILITY_SPHERE,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY_SPHERE; else if (GetHasSpell(SPELL_HASTE,oMe)>0&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_DISPLACEMENT,oMe)>0&&GetHasSpellEffect(SPELL_DISPLACEMENT,oMe)==FALSE) return SPELL_DISPLACEMENT; else if (GetHasSpell(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)>0&&GetHasSpellEffect(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)==FALSE&&d4()<3) return SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oMe)==FALSE) return SPELL_SEE_INVISIBILITY; else if (GetHasSpell(SPELL_RESIST_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oMe)==FALSE) return SPELL_RESIST_ELEMENTS; else if (GetHasSpell(SPELL_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_INIVSIBILITY; else if (GetHasSpell(SPELL_GHOSTLY_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_GHOSTLY_VISAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_GHOSTLY_VISAGE; else if (GetHasSpell(SPELL_DEATH_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_ARMOR,oMe)==FALSE) return SPELL_DEATH_ARMOR; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oMe)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oMe)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_CATS_GRACE,oMe)>0&&GetHasSpellEffect(SPELL_CATS_GRACE,oMe)==FALSE) return SPELL_CATS_GRACE; else if (GetHasSpell(SPELL_SHADES_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_SHADES_STONESKIN; else if (GetHasSpell(SPELL_BARKSKIN,oMe)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_AURAOFGLORY,oMe)>0&&GetHasSpellEffect(SPELL_AURAOFGLORY,oMe)==FALSE) return SPELL_AURAOFGLORY; else if (GetHasSpell(SPELL_AID,oMe)>0&&GetHasSpellEffect(SPELL_AID,oMe)==FALSE) return SPELL_AID; else if (GetHasSpell(SPELL_TRUE_STRIKE,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_STRIKE,oMe)==FALSE) return SPELL_TRUE_STRIKE; else if (GetHasSpell(SPELL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD,oMe)==FALSE) return SPELL_SHIELD; else if (GetHasSpell(SPELL_SHIELD_OF_FAITH,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_FAITH,oMe)==FALSE) return SPELL_SHIELD_OF_FAITH; else if (GetHasSpell(SPELL_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE) return SPELL_MAGE_ARMOR; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_MAGE_ARMOR; else if (GetHasSpell(SPELL_SANCTUARY,oMe)>0&&GetHasSpellEffect(SPELL_SANCTUARY,oMe)==FALSE&&d4()==1) return SPELL_SANCTUARY; else if (GetHasSpell(SPELL_IRONGUTS,oMe)>0&&GetHasSpellEffect(SPELL_IRONGUTS,oMe)==FALSE) return SPELL_IRONGUTS; else if (GetHasSpell(SPELL_EXPEDITIOUS_RETREAT,oMe)>0&&GetHasSpellEffect(SPELL_EXPEDITIOUS_RETREAT,oMe)==FALSE&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_EXPEDITIOUS_RETREAT; else if (GetHasSpell(SPELL_ENTROPIC_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ENTROPIC_SHIELD,oMe)==FALSE) return SPELL_ENTROPIC_SHIELD; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_DIVINE_FAVOR,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_FAVOR,oMe)==FALSE) return SPELL_DIVINE_FAVOR; else if (GetHasSpell(SPELL_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_VINE_MINE_CAMOUFLAGE; else if (GetHasSpell(SPELL_VINE_MINE_CAMOUFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_VINE_MINE_CAMOUFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_CAMOFLAGE; else if (GetHasSpell(SPELL_BLESS_WEAPON,oMe)>0&&GetHasSpellEffect(SPELL_BLESS_WEAPON,oMe)==FALSE) return SPELL_BLESS_WEAPON; else if (GetHasSpell(SPELL_BLESS,oMe)>0&&GetHasSpellEffect(SPELL_BLESS,oMe)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_PROTECTION_FROM_EVIL,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL,oMe)==FALSE&&nAGE!=ALIGNMENT_EVIL) return SPELL_PROTECTION_FROM_EVIL; else if (GetHasSpell(SPELL_PROTECTION_FROM_GOOD,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_GOOD,oMe)==FALSE&&nAGE!=ALIGNMENT_GOOD) return SPELL_PROTECTION_FROM_GOOD; else if (GetHasSpell(SPELL_PROTECTION_FROM_LAW,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_LAW,oMe)==FALSE&&nALC!=ALIGNMENT_LAWFUL) return SPELL_PROTECTION_FROM_LAW; else if (GetHasSpell(SPELL_PROTECTION__FROM_CHAOS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION__FROM_CHAOS,oMe)==FALSE&&nALC!=ALIGNMENT_CHAOTIC) return SPELL_PROTECTION__FROM_CHAOS; else if (GetHasSpell(SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oMe)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_VIRTUE,oMe)>0&&GetHasSpellEffect(SPELL_VIRTUE,oMe)==FALSE) return SPELL_VIRTUE; else if (GetHasSpell(SPELL_PROTECTION_FROM_SPELLS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_SPELLS,oMe)==FALSE) return SPELL_PROTECTION_FROM_SPELLS; } // divine opponents if (nUND>0) { // undead opponents if (GetHasSpell(SPELL_PREMONITION,oMe)>0&&GetHasSpellEffect(SPELL_PREMONITION,oMe)==FALSE) return SPELL_PREMONITION; else if (GetHasSpell(SPELL_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_MIND_BLANK; else if (GetHasSpell(SPELLABILITY_AURA_PROTECTION,oMe)>0&&GetHasSpellEffect(SPELLABILITY_AURA_PROTECTION,oMe)==FALSE) return SPELLABILITY_AURA_PROTECTION; else if (GetHasSpell(SPELL_TRUE_SEEING,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_SEEING,oMe)==FALSE) return SPELL_TRUE_SEEING; else if (GetHasSpell(SPELL_SHADOW_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_SHIELD,oMe)==FALSE) return SPELL_SHADOW_SHIELD; else if (GetHasSpell(SPELL_REGENERATE,oMe)>0&&GetHasSpellEffect(SPELL_REGENERATE,oMe)==FALSE) return SPELL_REGENERATE; else if (GetHasSpell(SPELL_AURA_OF_VITALITY,oMe)>0&&GetHasSpellEffect(SPELL_AURA_OF_VITALITY,oMe)==FALSE) return SPELL_AURA_OF_VITALITY; else if (GetHasSpell(SPELL_ETHEREAL_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_ETHEREAL_VISAGE; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_CIRCLE_OF_DEATH,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DEATH,oMe)==FALSE) return SPELL_CIRCLE_OF_DEATH; else if (GetHasSpell(SPELL_MONSTROUS_REGENERATION,oMe)>0&&GetHasSpellEffect(SPELL_MONSTROUS_REGENERATION,oMe)==FALSE) return SPELL_MONSTROUS_REGENERATION; else if (GetHasSpell(SPELL_LESSER_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oMe)==FALSE&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_LESSER_MIND_BLANK; else if (GetHasSpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_MINOR_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE; else if (GetHasSpell(SPELL_CIRCLE_OF_DOOM,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DOOM,oMe)==FALSE) return SPELL_CIRCLE_OF_DOOM; else if (GetHasSpell(SPELL_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_DEATH_WARD,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oMe)==FALSE) return SPELL_DEATH_WARD; else if (GetHasSpell(SPELL_FREEDOM_OF_MOVEMENT,oMe)>0&&GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT,oMe)==FALSE) return SPELL_FREEDOM_OF_MOVEMENT; else if (GetHasSpell(SPELL_IMPROVED_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_IMPROVED_INVISIBILITY; else if (GetHasSpell(SPELL_MASS_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_MASS_CAMOFLAGE; else if (GetHasSpell(SPELL_DIVINE_POWER,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_POWER,oMe)==FALSE) return SPELL_DIVINE_POWER; else if (GetHasSpell(SPELL_ELEMENTAL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD,oMe)==FALSE) return SPELL_ELEMENTAL_SHIELD; else if (GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_PROTECTION_FROM_ELEMENTS; else if (GetHasSpell(SPELL_PRAYER,oMe)>0&&GetHasSpellEffect(SPELL_PRAYER,oMe)==FALSE) return SPELL_PRAYER; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oMe)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oMe)==FALSE&&d4()<3) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_INVISIBILITY_SPHERE,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY_SPHERE; else if (GetHasSpell(SPELL_HASTE,oMe)>0&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_DISPLACEMENT,oMe)>0&&GetHasSpellEffect(SPELL_DISPLACEMENT,oMe)==FALSE) return SPELL_DISPLACEMENT; else if (GetHasSpell(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)>0&&GetHasSpellEffect(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)==FALSE&&d4()<3) return SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oMe)==FALSE) return SPELL_SEE_INVISIBILITY; else if (GetHasSpell(SPELL_RESIST_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oMe)==FALSE) return SPELL_RESIST_ELEMENTS; else if (GetHasSpell(SPELL_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_INIVSIBILITY; else if (GetHasSpell(SPELL_GHOSTLY_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_GHOSTLY_VISAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_GHOSTLY_VISAGE; else if (GetHasSpell(SPELL_DEATH_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_ARMOR,oMe)==FALSE) return SPELL_DEATH_ARMOR; else if (GetHasSpell(SPELL_CATS_GRACE,oMe)>0&&GetHasSpellEffect(SPELL_CATS_GRACE,oMe)==FALSE) return SPELL_CATS_GRACE; else if (GetHasSpell(SPELL_SHADES_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_SHADES_STONESKIN; else if (GetHasSpell(SPELL_BARKSKIN,oMe)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_AURAOFGLORY,oMe)>0&&GetHasSpellEffect(SPELL_AURAOFGLORY,oMe)==FALSE) return SPELL_AURAOFGLORY; else if (GetHasSpell(SPELL_AID,oMe)>0&&GetHasSpellEffect(SPELL_AID,oMe)==FALSE) return SPELL_AID; else if (GetHasSpell(SPELL_TRUE_STRIKE,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_STRIKE,oMe)==FALSE) return SPELL_TRUE_STRIKE; else if (GetHasSpell(SPELL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD,oMe)==FALSE) return SPELL_SHIELD; else if (GetHasSpell(SPELL_SHIELD_OF_FAITH,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_FAITH,oMe)==FALSE) return SPELL_SHIELD_OF_FAITH; else if (GetHasSpell(SPELL_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE) return SPELL_MAGE_ARMOR; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_MAGE_ARMOR; else if (GetHasSpell(SPELL_SANCTUARY,oMe)>0&&GetHasSpellEffect(SPELL_SANCTUARY,oMe)==FALSE&&d4()==1) return SPELL_SANCTUARY; else if (GetHasSpell(SPELL_IRONGUTS,oMe)>0&&GetHasSpellEffect(SPELL_IRONGUTS,oMe)==FALSE) return SPELL_IRONGUTS; else if (GetHasSpell(SPELL_EXPEDITIOUS_RETREAT,oMe)>0&&GetHasSpellEffect(SPELL_EXPEDITIOUS_RETREAT,oMe)==FALSE&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_EXPEDITIOUS_RETREAT; else if (GetHasSpell(SPELL_ENTROPIC_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ENTROPIC_SHIELD,oMe)==FALSE) return SPELL_ENTROPIC_SHIELD; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_DIVINE_FAVOR,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_FAVOR,oMe)==FALSE) return SPELL_DIVINE_FAVOR; else if (GetHasSpell(SPELL_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_VINE_MINE_CAMOUFLAGE; else if (GetHasSpell(SPELL_VINE_MINE_CAMOUFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_VINE_MINE_CAMOUFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_CAMOFLAGE; else if (GetHasSpell(SPELL_BLESS_WEAPON,oMe)>0&&GetHasSpellEffect(SPELL_BLESS_WEAPON,oMe)==FALSE) return SPELL_BLESS_WEAPON; else if (GetHasSpell(SPELL_BLESS,oMe)>0&&GetHasSpellEffect(SPELL_BLESS,oMe)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_PROTECTION_FROM_EVIL,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL,oMe)==FALSE&&nAGE!=ALIGNMENT_EVIL) return SPELL_PROTECTION_FROM_EVIL; else if (GetHasSpell(SPELL_PROTECTION_FROM_GOOD,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_GOOD,oMe)==FALSE&&nAGE!=ALIGNMENT_GOOD) return SPELL_PROTECTION_FROM_GOOD; else if (GetHasSpell(SPELL_PROTECTION_FROM_LAW,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_LAW,oMe)==FALSE&&nALC!=ALIGNMENT_LAWFUL) return SPELL_PROTECTION_FROM_LAW; else if (GetHasSpell(SPELL_PROTECTION__FROM_CHAOS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION__FROM_CHAOS,oMe)==FALSE&&nALC!=ALIGNMENT_CHAOTIC) return SPELL_PROTECTION__FROM_CHAOS; else if (GetHasSpell(SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oMe)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_VIRTUE,oMe)>0&&GetHasSpellEffect(SPELL_VIRTUE,oMe)==FALSE) return SPELL_VIRTUE; } // undead opponents if (nOUT>0) { // outsider opponents if (GetHasSpell(SPELL_GREATER_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_GREATER_SPELL_MANTLE; else if (GetHasSpell(SPELL_TIME_STOP,oMe)>0&&GetHasSpellEffect(SPELL_TIME_STOP,oMe)==FALSE&&d4()==1) return SPELL_TIME_STOP; else if (GetHasSpell(SPELL_PREMONITION,oMe)>0&&GetHasSpellEffect(SPELL_PREMONITION,oMe)==FALSE) return SPELL_PREMONITION; else if (GetHasSpell(SPELL_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_MIND_BLANK; else if (GetHasSpell(SPELLABILITY_AURA_PROTECTION,oMe)>0&&GetHasSpellEffect(SPELLABILITY_AURA_PROTECTION,oMe)==FALSE) return SPELLABILITY_AURA_PROTECTION; else if (GetHasSpell(SPELL_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_SPELL_MANTLE; else if (GetHasSpell(SPELL_TRUE_SEEING,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_SEEING,oMe)==FALSE) return SPELL_TRUE_SEEING; else if (GetHasSpell(SPELL_SHADOW_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_SHIELD,oMe)==FALSE) return SPELL_SHADOW_SHIELD; else if (GetHasSpell(SPELL_REGENERATE,oMe)>0&&GetHasSpellEffect(SPELL_REGENERATE,oMe)==FALSE) return SPELL_REGENERATE; else if (GetHasSpell(SPELL_AURA_OF_VITALITY,oMe)>0&&GetHasSpellEffect(SPELL_AURA_OF_VITALITY,oMe)==FALSE) return SPELL_AURA_OF_VITALITY; else if (GetHasSpell(SPELL_ETHEREAL_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_ETHEREAL_VISAGE; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_CIRCLE_OF_DEATH,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DEATH,oMe)==FALSE) return SPELL_CIRCLE_OF_DEATH; else if (GetHasSpell(SPELL_SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_SPELL_RESISTANCE,oMe)==FALSE) return SPELL_SPELL_RESISTANCE; else if (GetHasSpell(SPELL_MONSTROUS_REGENERATION,oMe)>0&&GetHasSpellEffect(SPELL_MONSTROUS_REGENERATION,oMe)==FALSE) return SPELL_MONSTROUS_REGENERATION; else if (GetHasSpell(SPELL_LESSER_SPELL_MANTLE,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_SPELL_MANTLE,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE,oMe)==FALSE) return SPELL_LESSER_SPELL_MANTLE; else if (GetHasSpell(SPELL_LESSER_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oMe)==FALSE&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_LESSER_MIND_BLANK; else if (GetHasSpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)>0&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_MINOR_GLOBE_OF_INVULNERABILITY; else if (GetHasSpell(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY,oMe)==FALSE) return SPELL_GREATER_SHADOW_CONJURATION_MINOR_GLOBE; else if (GetHasSpell(SPELL_CIRCLE_OF_DOOM,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DOOM,oMe)==FALSE) return SPELL_CIRCLE_OF_DOOM; else if (GetHasSpell(SPELL_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_DEATH_WARD,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oMe)==FALSE) return SPELL_DEATH_WARD; else if (GetHasSpell(SPELL_FREEDOM_OF_MOVEMENT,oMe)>0&&GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT,oMe)==FALSE) return SPELL_FREEDOM_OF_MOVEMENT; else if (GetHasSpell(SPELL_IMPROVED_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_IMPROVED_INVISIBILITY; else if (GetHasSpell(SPELL_MASS_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_MASS_CAMOFLAGE; else if (GetHasSpell(SPELL_DIVINE_POWER,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_POWER,oMe)==FALSE) return SPELL_DIVINE_POWER; else if (GetHasSpell(SPELL_ELEMENTAL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD,oMe)==FALSE) return SPELL_ELEMENTAL_SHIELD; else if (GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_PROTECTION_FROM_ELEMENTS; else if (GetHasSpell(SPELL_PRAYER,oMe)>0&&GetHasSpellEffect(SPELL_PRAYER,oMe)==FALSE) return SPELL_PRAYER; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oMe)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oMe)==FALSE&&d4()<3) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_INVISIBILITY_SPHERE,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY_SPHERE; else if (GetHasSpell(SPELL_HASTE,oMe)>0&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_DISPLACEMENT,oMe)>0&&GetHasSpellEffect(SPELL_DISPLACEMENT,oMe)==FALSE) return SPELL_DISPLACEMENT; else if (GetHasSpell(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)>0&&GetHasSpellEffect(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)==FALSE&&d4()<3) return SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oMe)==FALSE) return SPELL_SEE_INVISIBILITY; else if (GetHasSpell(SPELL_RESIST_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oMe)==FALSE) return SPELL_RESIST_ELEMENTS; else if (GetHasSpell(SPELL_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_INIVSIBILITY; else if (GetHasSpell(SPELL_GHOSTLY_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_GHOSTLY_VISAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_GHOSTLY_VISAGE; else if (GetHasSpell(SPELL_DEATH_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_ARMOR,oMe)==FALSE) return SPELL_DEATH_ARMOR; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oMe)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oMe)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_CATS_GRACE,oMe)>0&&GetHasSpellEffect(SPELL_CATS_GRACE,oMe)==FALSE) return SPELL_CATS_GRACE; else if (GetHasSpell(SPELL_SHADES_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_SHADES_STONESKIN; else if (GetHasSpell(SPELL_BARKSKIN,oMe)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_AURAOFGLORY,oMe)>0&&GetHasSpellEffect(SPELL_AURAOFGLORY,oMe)==FALSE) return SPELL_AURAOFGLORY; else if (GetHasSpell(SPELL_AID,oMe)>0&&GetHasSpellEffect(SPELL_AID,oMe)==FALSE) return SPELL_AID; else if (GetHasSpell(SPELL_TRUE_STRIKE,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_STRIKE,oMe)==FALSE) return SPELL_TRUE_STRIKE; else if (GetHasSpell(SPELL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD,oMe)==FALSE) return SPELL_SHIELD; else if (GetHasSpell(SPELL_SHIELD_OF_FAITH,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_FAITH,oMe)==FALSE) return SPELL_SHIELD_OF_FAITH; else if (GetHasSpell(SPELL_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE) return SPELL_MAGE_ARMOR; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_MAGE_ARMOR; else if (GetHasSpell(SPELL_SANCTUARY,oMe)>0&&GetHasSpellEffect(SPELL_SANCTUARY,oMe)==FALSE&&d4()==1) return SPELL_SANCTUARY; else if (GetHasSpell(SPELL_IRONGUTS,oMe)>0&&GetHasSpellEffect(SPELL_IRONGUTS,oMe)==FALSE) return SPELL_IRONGUTS; else if (GetHasSpell(SPELL_EXPEDITIOUS_RETREAT,oMe)>0&&GetHasSpellEffect(SPELL_EXPEDITIOUS_RETREAT,oMe)==FALSE&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_EXPEDITIOUS_RETREAT; else if (GetHasSpell(SPELL_ENTROPIC_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ENTROPIC_SHIELD,oMe)==FALSE) return SPELL_ENTROPIC_SHIELD; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_DIVINE_FAVOR,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_FAVOR,oMe)==FALSE) return SPELL_DIVINE_FAVOR; else if (GetHasSpell(SPELL_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_VINE_MINE_CAMOUFLAGE; else if (GetHasSpell(SPELL_VINE_MINE_CAMOUFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_VINE_MINE_CAMOUFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_CAMOFLAGE; else if (GetHasSpell(SPELL_BLESS_WEAPON,oMe)>0&&GetHasSpellEffect(SPELL_BLESS_WEAPON,oMe)==FALSE) return SPELL_BLESS_WEAPON; else if (GetHasSpell(SPELL_BLESS,oMe)>0&&GetHasSpellEffect(SPELL_BLESS,oMe)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_PROTECTION_FROM_EVIL,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL,oMe)==FALSE&&nAGE!=ALIGNMENT_EVIL) return SPELL_PROTECTION_FROM_EVIL; else if (GetHasSpell(SPELL_PROTECTION_FROM_GOOD,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_GOOD,oMe)==FALSE&&nAGE!=ALIGNMENT_GOOD) return SPELL_PROTECTION_FROM_GOOD; else if (GetHasSpell(SPELL_PROTECTION_FROM_LAW,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_LAW,oMe)==FALSE&&nALC!=ALIGNMENT_LAWFUL) return SPELL_PROTECTION_FROM_LAW; else if (GetHasSpell(SPELL_PROTECTION__FROM_CHAOS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION__FROM_CHAOS,oMe)==FALSE&&nALC!=ALIGNMENT_CHAOTIC) return SPELL_PROTECTION__FROM_CHAOS; else if (GetHasSpell(SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oMe)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_VIRTUE,oMe)>0&&GetHasSpellEffect(SPELL_VIRTUE,oMe)==FALSE) return SPELL_VIRTUE; else if (GetHasSpell(SPELL_PROTECTION_FROM_SPELLS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_SPELLS,oMe)==FALSE) return SPELL_PROTECTION_FROM_SPELLS; } // outsider opponents if (nRT==RACIAL_TYPE_UNDEAD) { // undead target if (GetHasSpell(SPELL_NEGATIVE_ENERGY_PROTECTION,oMe)>0&&GetHasSpellEffect(SPELL_NEGATIVE_ENERGY_PROTECTION,oMe)==FALSE) return SPELL_NEGATIVE_ENERGY_PROTECTION; } // undead target else { // other target if (GetHasSpell(SPELL_CATS_GRACE,oMe)>0&&GetHasSpellEffect(SPELL_CATS_GRACE,oMe)==FALSE) return SPELL_CATS_GRACE; else if (GetHasSpell(SPELL_FOXS_CUNNING,oMe)>0&&GetHasSpellEffect(SPELL_FOXS_CUNNING,oMe)==FALSE) return SPELL_FOXS_CUNNING; else if (GetHasSpell(SPELL_OWLS_WISDOM,oMe)>0&&GetHasSpellEffect(SPELL_OWLS_WISDOM,oMe)==FALSE) return SPELL_OWLS_WISDOM; else if (GetHasSpell(SPELL_ONE_WITH_THE_LAND,oMe)>0&&GetHasSpellEffect(SPELL_ONE_WITH_THE_LAND,oMe)==FALSE) return SPELL_ONE_WITH_THE_LAND; else if (GetHasSpell(SPELL_TIME_STOP,oMe)>0&&GetHasSpellEffect(SPELL_TIME_STOP,oMe)==FALSE&&d4()==1) return SPELL_TIME_STOP; else if (GetHasSpell(SPELL_PREMONITION,oMe)>0&&GetHasSpellEffect(SPELL_PREMONITION,oMe)==FALSE) return SPELL_PREMONITION; else if (GetHasSpell(SPELL_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_MIND_BLANK; else if (GetHasSpell(SPELLABILITY_AURA_PROTECTION,oMe)>0&&GetHasSpellEffect(SPELLABILITY_AURA_PROTECTION,oMe)==FALSE) return SPELLABILITY_AURA_PROTECTION; else if (GetHasSpell(SPELL_TRUE_SEEING,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_SEEING,oMe)==FALSE) return SPELL_TRUE_SEEING; else if (GetHasSpell(SPELL_SHADOW_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_SHIELD,oMe)==FALSE) return SPELL_SHADOW_SHIELD; else if (GetHasSpell(SPELL_REGENERATE,oMe)>0&&GetHasSpellEffect(SPELL_REGENERATE,oMe)==FALSE) return SPELL_REGENERATE; else if (GetHasSpell(SPELL_AURA_OF_VITALITY,oMe)>0&&GetHasSpellEffect(SPELL_AURA_OF_VITALITY,oMe)==FALSE) return SPELL_AURA_OF_VITALITY; else if (GetHasSpell(SPELL_ETHEREAL_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_ETHEREAL_VISAGE; else if (GetHasSpell(SPELL_GREATER_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_GREATER_STONESKIN; else if (GetHasSpell(SPELL_CIRCLE_OF_DEATH,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DEATH,oMe)==FALSE) return SPELL_CIRCLE_OF_DEATH; else if (GetHasSpell(SPELL_SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_SPELL_RESISTANCE,oMe)==FALSE) return SPELL_SPELL_RESISTANCE; else if (GetHasSpell(SPELL_MONSTROUS_REGENERATION,oMe)>0&&GetHasSpellEffect(SPELL_MONSTROUS_REGENERATION,oMe)==FALSE) return SPELL_MONSTROUS_REGENERATION; else if (GetHasSpell(SPELL_LESSER_MIND_BLANK,oMe)>0&&GetHasSpellEffect(SPELL_LESSER_MIND_BLANK,oMe)==FALSE&&GetHasSpellEffect(SPELL_MIND_BLANK,oMe)==FALSE) return SPELL_LESSER_MIND_BLANK; else if (GetHasSpell(SPELL_CIRCLE_OF_DOOM,oMe)>0&&GetHasSpellEffect(SPELL_CIRCLE_OF_DOOM,oMe)==FALSE) return SPELL_CIRCLE_OF_DOOM; else if (GetHasSpell(SPELL_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_STONESKIN; else if (GetHasSpell(SPELL_DEATH_WARD,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_WARD,oMe)==FALSE) return SPELL_DEATH_WARD; else if (GetHasSpell(SPELL_FREEDOM_OF_MOVEMENT,oMe)>0&&GetHasSpellEffect(SPELL_FREEDOM_OF_MOVEMENT,oMe)==FALSE) return SPELL_FREEDOM_OF_MOVEMENT; else if (GetHasSpell(SPELL_IMPROVED_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_IMPROVED_INVISIBILITY; else if (GetHasSpell(SPELL_MASS_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_MASS_CAMOFLAGE; else if (GetHasSpell(SPELL_DIVINE_POWER,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_POWER,oMe)==FALSE) return SPELL_DIVINE_POWER; else if (GetHasSpell(SPELL_ELEMENTAL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD,oMe)==FALSE) return SPELL_ELEMENTAL_SHIELD; else if (GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS,oMe)==FALSE) return SPELL_PROTECTION_FROM_ELEMENTS; else if (GetHasSpell(SPELL_PRAYER,oMe)>0&&GetHasSpellEffect(SPELL_PRAYER,oMe)==FALSE) return SPELL_PRAYER; else if (GetHasSpell(SPELL_MAGIC_VESTMENT,oMe)>0&&GetHasSpellEffect(SPELL_MAGIC_VESTMENT,oMe)==FALSE&&d4()<3) return SPELL_MAGIC_VESTMENT; else if (GetHasSpell(SPELL_INVISIBILITY_SPHERE,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY_SPHERE; else if (GetHasSpell(SPELL_HASTE,oMe)>0&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_HASTE; else if (GetHasSpell(SPELL_DISPLACEMENT,oMe)>0&&GetHasSpellEffect(SPELL_DISPLACEMENT,oMe)==FALSE) return SPELL_DISPLACEMENT; else if (GetHasSpell(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)>0&&GetHasSpellEffect(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE,oMe)==FALSE&&d4()<3) return SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE; else if (GetHasSpell(SPELL_SEE_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SEE_INVISIBILITY,oMe)==FALSE) return SPELL_SEE_INVISIBILITY; else if (GetHasSpell(SPELL_RESIST_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_RESIST_ELEMENTS,oMe)==FALSE) return SPELL_RESIST_ELEMENTS; else if (GetHasSpell(SPELL_INVISIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_INVISIBILITY; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)>0&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_INIVSIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY,oMe)==FALSE&&GetHasSpellEffect(SPELL_INVISIBILITY_SPHERE,oMe)==FALSE&&GetHasSpellEffect(SPELL_IMPROVED_INVISIBILITY,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_INIVSIBILITY; else if (GetHasSpell(SPELL_GHOSTLY_VISAGE,oMe)>0&&GetHasSpellEffect(SPELL_GHOSTLY_VISAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_ETHEREAL_VISAGE,oMe)==FALSE) return SPELL_GHOSTLY_VISAGE; else if (GetHasSpell(SPELL_DEATH_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_DEATH_ARMOR,oMe)==FALSE) return SPELL_DEATH_ARMOR; else if (GetHasSpell(SPELL_BULLS_STRENGTH,oMe)>0&&GetHasSpellEffect(SPELL_BULLS_STRENGTH,oMe)==FALSE) return SPELL_BULLS_STRENGTH; else if (GetHasSpell(SPELL_CATS_GRACE,oMe)>0&&GetHasSpellEffect(SPELL_CATS_GRACE,oMe)==FALSE) return SPELL_CATS_GRACE; else if (GetHasSpell(SPELL_SHADES_STONESKIN,oMe)>0&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_SHADES_STONESKIN; else if (GetHasSpell(SPELL_BARKSKIN,oMe)>0&&GetHasSpellEffect(SPELL_BARKSKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADES_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_STONESKIN,oMe)==FALSE&&GetHasSpellEffect(SPELL_GREATER_STONESKIN,oMe)==FALSE) return SPELL_BARKSKIN; else if (GetHasSpell(SPELL_AURAOFGLORY,oMe)>0&&GetHasSpellEffect(SPELL_AURAOFGLORY,oMe)==FALSE) return SPELL_AURAOFGLORY; else if (GetHasSpell(SPELL_AID,oMe)>0&&GetHasSpellEffect(SPELL_AID,oMe)==FALSE) return SPELL_AID; else if (GetHasSpell(SPELL_TRUE_STRIKE,oMe)>0&&GetHasSpellEffect(SPELL_TRUE_STRIKE,oMe)==FALSE) return SPELL_TRUE_STRIKE; else if (GetHasSpell(SPELL_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD,oMe)==FALSE) return SPELL_SHIELD; else if (GetHasSpell(SPELL_SHIELD_OF_FAITH,oMe)>0&&GetHasSpellEffect(SPELL_SHIELD_OF_FAITH,oMe)==FALSE) return SPELL_SHIELD_OF_FAITH; else if (GetHasSpell(SPELL_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE) return SPELL_MAGE_ARMOR; else if (GetHasSpell(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)>0&&GetHasSpellEffect(SPELL_MAGE_ARMOR,oMe)==FALSE&&GetHasSpellEffect(SPELL_SHADOW_CONJURATION_MAGE_ARMOR,oMe)==FALSE) return SPELL_SHADOW_CONJURATION_MAGE_ARMOR; else if (GetHasSpell(SPELL_SANCTUARY,oMe)>0&&GetHasSpellEffect(SPELL_SANCTUARY,oMe)==FALSE&&d4()==1) return SPELL_SANCTUARY; else if (GetHasSpell(SPELL_IRONGUTS,oMe)>0&&GetHasSpellEffect(SPELL_IRONGUTS,oMe)==FALSE) return SPELL_IRONGUTS; else if (GetHasSpell(SPELL_EXPEDITIOUS_RETREAT,oMe)>0&&GetHasSpellEffect(SPELL_EXPEDITIOUS_RETREAT,oMe)==FALSE&&GetHasSpellEffect(SPELL_HASTE,oMe)==FALSE) return SPELL_EXPEDITIOUS_RETREAT; else if (GetHasSpell(SPELL_ENTROPIC_SHIELD,oMe)>0&&GetHasSpellEffect(SPELL_ENTROPIC_SHIELD,oMe)==FALSE) return SPELL_ENTROPIC_SHIELD; else if (GetHasSpell(SPELL_ENDURE_ELEMENTS,oMe)>0&&GetHasSpellEffect(SPELL_ENDURE_ELEMENTS,oMe)==FALSE) return SPELL_ENDURE_ELEMENTS; else if (GetHasSpell(SPELL_DIVINE_FAVOR,oMe)>0&&GetHasSpellEffect(SPELL_DIVINE_FAVOR,oMe)==FALSE) return SPELL_DIVINE_FAVOR; else if (GetHasSpell(SPELL_CAMOFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_VINE_MINE_CAMOUFLAGE; else if (GetHasSpell(SPELL_VINE_MINE_CAMOUFLAGE,oMe)>0&&GetHasSpellEffect(SPELL_VINE_MINE_CAMOUFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_CAMOFLAGE,oMe)==FALSE&&GetHasSpellEffect(SPELL_MASS_CAMOFLAGE,oMe)==FALSE) return SPELL_CAMOFLAGE; else if (GetHasSpell(SPELL_BLESS_WEAPON,oMe)>0&&GetHasSpellEffect(SPELL_BLESS_WEAPON,oMe)==FALSE) return SPELL_BLESS_WEAPON; else if (GetHasSpell(SPELL_BLESS,oMe)>0&&GetHasSpellEffect(SPELL_BLESS,oMe)==FALSE) return SPELL_BLESS; else if (GetHasSpell(SPELL_PROTECTION_FROM_EVIL,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_EVIL,oMe)==FALSE&&nAGE!=ALIGNMENT_EVIL) return SPELL_PROTECTION_FROM_EVIL; else if (GetHasSpell(SPELL_PROTECTION_FROM_GOOD,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_GOOD,oMe)==FALSE&&nAGE!=ALIGNMENT_GOOD) return SPELL_PROTECTION_FROM_GOOD; else if (GetHasSpell(SPELL_PROTECTION_FROM_LAW,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION_FROM_LAW,oMe)==FALSE&&nALC!=ALIGNMENT_LAWFUL) return SPELL_PROTECTION_FROM_LAW; else if (GetHasSpell(SPELL_PROTECTION__FROM_CHAOS,oMe)>0&&GetHasSpellEffect(SPELL_PROTECTION__FROM_CHAOS,oMe)==FALSE&&nALC!=ALIGNMENT_CHAOTIC) return SPELL_PROTECTION__FROM_CHAOS; else if (GetHasSpell(SPELL_RESISTANCE,oMe)>0&&GetHasSpellEffect(SPELL_RESISTANCE,oMe)==FALSE) return SPELL_RESISTANCE; else if (GetHasSpell(SPELL_VIRTUE,oMe)>0&&GetHasSpellEffect(SPELL_VIRTUE,oMe)==FALSE) return SPELL_VIRTUE; } // other target return 0; } // caiProfessionalDefensive() int caiProfessionalCounter(object oTarget) { // PURPOSE: Return counter magic to spells on target object oMe=OBJECT_SELF; if (GetHasSpell(SPELL_MORDENKAINENS_DISJUNCTION,oMe)>0) return SPELL_MORDENKAINENS_DISJUNCTION; else if (GetHasSpell(SPELL_GREATER_SPELL_BREACH,oMe)>0&&d4()<3) return SPELL_GREATER_SPELL_BREACH; else if (GetHasSpell(SPELL_GREATER_DISPELLING,oMe)>0) return SPELL_GREATER_DISPELLING; else if (GetHasSpell(SPELL_LESSER_SPELL_BREACH,oMe)>0&&d4()<3) return SPELL_LESSER_SPELL_BREACH; else if (GetHasSpell(SPELL_DISPEL_MAGIC,oMe)>0) return SPELL_DISPEL_MAGIC; else if (GetHasSpell(SPELL_LESSER_DISPEL,oMe)>0) return SPELL_LESSER_DISPEL; return 0; } // caiProfessionalCounter() int caiProfessionalCloseQuarters(object oTarget) { // PURPOSE: Return offensive close quarter spell int nRT=GetRacialType(oTarget); object oMe=OBJECT_SELF; if (GetMaster(oTarget)!=oTarget&&GetIsObjectValid(GetMaster(oTarget))&&GetAssociateType(oTarget)==ASSOCIATE_TYPE_SUMMONED) { // summoned if (GetHasSpell(SPELL_BANISHMENT,oMe)>0&&d4()<3) return SPELL_BANISHMENT; else if (GetHasSpell(SPELL_DISMISSAL,oMe)>0&&d4()<3) return SPELL_DISMISSAL; } // summoned if (nRT==RACIAL_TYPE_UNDEAD||GetLocalInt(oTarget,"nIsVampire")==TRUE) { // undead if (GetHasSpell(SPELL_BIGBYS_CRUSHING_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_CRUSHING_HAND; else if (GetHasSpell(SPELL_BIGBYS_CLENCHED_FIST,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_CLENCHED_FIST,oTarget)==FALSE) return SPELL_BIGBYS_CLENCHED_FIST; else if (GetHasSpell(SPELL_WORD_OF_FAITH,oMe)>0&&d4()<3) return SPELL_WORD_OF_FAITH; else if (GetHasSpell(SPELL_UNDEATH_TO_DEATH,oMe)>0) return SPELL_UNDEATH_TO_DEATH; else if (GetHasSpell(SPELL_CONTROL_UNDEAD,oMe)>0&&GetHasSpellEffect(SPELL_CONTROL_UNDEAD,oTarget)==FALSE) return SPELL_BIGBYS_CRUSHING_HAND; else if (GetHasSpell(SPELL_BIGBYS_GRASPING_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_GRASPING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_GRASPING_HAND; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oMe)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oMe)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_HEAL,oMe)>0) return SPELL_HEAL; else if (GetHasSpell(SPELL_BIGBYS_FORCEFUL_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_FORCEFUL_HAND,oTarget)==FALSE) return SPELL_BIGBYS_FORCEFUL_HAND; else if (GetHasSpell(SPELL_FIREBRAND,oMe)>0) return SPELL_FIREBRAND; else if (GetHasSpell(SPELL_BALL_LIGHTNING,oMe)>0) return SPELL_BALL_LIGHTNING; else if (GetHasSpell(SPELL_BIGBYS_INTERPOSING_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_INTERPOSING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_INTERPOSING_HAND; else if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oMe)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_HAMMER_OF_THE_GODS,oMe)>0) return SPELL_HAMMER_OF_THE_GODS; else if (GetHasSpell(SPELL_BESTOW_CURSE,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BESTOW_CURSE,oTarget)==FALSE) return SPELL_BESTOW_CURSE; else if (GetHasSpell(SPELL_CURE_CRITICAL_WOUNDS,oMe)>0) return SPELL_CURE_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oMe)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_SEARING_LIGHT,oMe)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SLOW,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_SLOW,oTarget)==FALSE) return SPELL_SLOW; else if (GetHasSpell(SPELL_QUILLFIRE,oMe)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oMe)>0&&d4()<3) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_CURE_SERIOUS_WOUNDS,oMe)>0) return SPELL_CURE_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_SOUND_BURST,oMe)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oMe)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_GEDLEES_ELECTRIC_LOOP,oMe)>0) return SPELL_GEDLEES_ELECTRIC_LOOP; else if (GetHasSpell(SPELL_FLAME_LASH,oMe)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_CURE_MODERATE_WOUNDS,oMe)>0) return SPELL_CURE_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_RAY_OF_ENFEEBLEMENT,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_RAY_OF_ENFEEBLEMENT,oTarget)==FALSE) return SPELL_RAY_OF_ENFEEBLEMENT; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oMe)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_ICE_DAGGER,oMe)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_DOOM,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_CURE_LIGHT_WOUNDS,oMe)>0) return SPELL_CURE_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_BURNING_HANDS,oMe)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_BANE,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BANE,oTarget)==FALSE) return SPELL_BANE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oMe)>0) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oMe)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_ACID_SPLASH,oMe)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_CURE_MINOR_WOUNDS,oMe)>0) return SPELL_CURE_MINOR_WOUNDS; } // undead else if (nRT==RACIAL_TYPE_CONSTRUCT) { // construct } // construct else { // other if (GetHasSpell(SPELL_BIGBYS_CRUSHING_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_CRUSHING_HAND; else if (GetHasSpell(SPELL_BIGBYS_CLENCHED_FIST,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_CLENCHED_FIST,oTarget)==FALSE) return SPELL_BIGBYS_CLENCHED_FIST; else if (GetHasSpell(SPELL_WORD_OF_FAITH,oMe)>0&&d4()<3) return SPELL_WORD_OF_FAITH; else if (GetHasSpell(SPELL_BIGBYS_GRASPING_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_GRASPING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_GRASPING_HAND; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oMe)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oMe)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_HARM,oMe)>0) return SPELL_HARM; else if (GetHasSpell(SPELL_BIGBYS_FORCEFUL_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_FORCEFUL_HAND,oTarget)==FALSE) return SPELL_BIGBYS_FORCEFUL_HAND; else if (GetHasSpell(SPELL_FIREBRAND,oMe)>0) return SPELL_FIREBRAND; else if (GetHasSpell(SPELL_BALL_LIGHTNING,oMe)>0) return SPELL_BALL_LIGHTNING; else if (GetHasSpell(SPELL_BIGBYS_INTERPOSING_HAND,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BIGBYS_INTERPOSING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_INTERPOSING_HAND; else if (GetHasSpell(SPELL_ISAACS_LESSER_MISSILE_STORM,oMe)>0) return SPELL_ISAACS_LESSER_MISSILE_STORM; else if (GetHasSpell(SPELL_HAMMER_OF_THE_GODS,oMe)>0) return SPELL_HAMMER_OF_THE_GODS; else if (GetHasSpell(SPELL_BESTOW_CURSE,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BESTOW_CURSE,oTarget)==FALSE) return SPELL_BESTOW_CURSE; else if (GetHasSpell(SPELL_INFLICT_CRITICAL_WOUNDS,oMe)>0) return SPELL_INFLICT_CRITICAL_WOUNDS; else if (GetHasSpell(SPELL_WOUNDING_WHISPERS,oMe)>0) return SPELL_WOUNDING_WHISPERS; else if (GetHasSpell(SPELL_SEARING_LIGHT,oMe)>0) return SPELL_SEARING_LIGHT; else if (GetHasSpell(SPELL_SLOW,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_SLOW,oTarget)==FALSE) return SPELL_SLOW; else if (GetHasSpell(SPELL_QUILLFIRE,oMe)>0) return SPELL_QUILLFIRE; else if (GetHasSpell(SPELL_LIGHTNING_BOLT,oMe)>0&&d4()<3) return SPELL_LIGHTNING_BOLT; else if (GetHasSpell(SPELL_INFLICT_SERIOUS_WOUNDS,oMe)>0) return SPELL_INFLICT_SERIOUS_WOUNDS; else if (GetHasSpell(SPELL_SOUND_BURST,oMe)>0) return SPELL_SOUND_BURST; else if (GetHasSpell(SPELL_MELFS_ACID_ARROW,oMe)>0) return SPELL_MELFS_ACID_ARROW; else if (GetHasSpell(SPELL_GEDLEES_ELECTRIC_LOOP,oMe)>0) return SPELL_GEDLEES_ELECTRIC_LOOP; else if (GetHasSpell(SPELL_FLAME_LASH,oMe)>0) return SPELL_FLAME_LASH; else if (GetHasSpell(SPELL_INFLICT_MODERATE_WOUNDS,oMe)>0) return SPELL_INFLICT_MODERATE_WOUNDS; else if (GetHasSpell(SPELL_RAY_OF_ENFEEBLEMENT,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_RAY_OF_ENFEEBLEMENT,oTarget)==FALSE) return SPELL_RAY_OF_ENFEEBLEMENT; else if (GetHasSpell(SPELL_MAGIC_MISSILE,oMe)>0) return SPELL_MAGIC_MISSILE; else if (GetHasSpell(SPELL_ICE_DAGGER,oMe)>0) return SPELL_ICE_DAGGER; else if (GetHasSpell(SPELL_DOOM,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_DOOM,oTarget)==FALSE) return SPELL_DOOM; else if (GetHasSpell(SPELL_INFLICT_LIGHT_WOUNDS,oMe)>0) return SPELL_INFLICT_LIGHT_WOUNDS; else if (GetHasSpell(SPELL_BURNING_HANDS,oMe)>0) return SPELL_BURNING_HANDS; else if (GetHasSpell(SPELL_BANE,oMe)>0&&d4()<3&&GetHasSpellEffect(SPELL_BANE,oTarget)==FALSE) return SPELL_BANE; else if (GetHasSpell(SPELL_RAY_OF_FROST,oMe)>0) return SPELL_RAY_OF_FROST; else if (GetHasSpell(SPELL_ELECTRIC_JOLT,oMe)>0) return SPELL_ELECTRIC_JOLT; else if (GetHasSpell(SPELL_ACID_SPLASH,oMe)>0) return SPELL_ACID_SPLASH; else if (GetHasSpell(SPELL_INFLICT_MINOR_WOUNDS,oMe)>0) return SPELL_INFLICT_MINOR_WOUNDS; } // other return 0; } // caiProfessionalCloseQuarters() int caiProfessionalOffensive(object oTarget) { // PURPOSE: Return offensive spells versus the target object oMe=OBJECT_SELF; int nRT=GetRacialType(oTarget); object oAlly; int bNoArea=FALSE; int nCT=fnGetCharmType(oTarget); if (GetDistanceBetween(oMe,oTarget)<3.1) return caiProfessionalCloseQuarters(oTarget); oAlly=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oTarget,1,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY); if (GetIsObjectValid(oAlly)&&oAlly!=oMe&&GetIsFriend(oAlly)&&GetDistanceBetween(oTarget,oAlly)<6.0) bNoArea=TRUE; if (GetMaster(oTarget)!=oTarget&&GetIsObjectValid(GetMaster(oTarget))&&GetAssociateType(oTarget)==ASSOCIATE_TYPE_SUMMONED) { // summoned if (GetHasSpell(SPELL_BANISHMENT,oMe)>0&&d4()<3) return SPELL_BANISHMENT; else if (GetHasSpell(SPELL_DISMISSAL,oMe)>0&&d4()<3) return SPELL_DISMISSAL; } // summoned if (nRT==RACIAL_TYPE_UNDEAD||GetLocalInt(oTarget,"nIsVampire")==TRUE) { // undead if (bNoArea) { // no area spells } // no area spells else { // any spells } // any spells } // undead else if (nRT==RACIAL_TYPE_CONSTRUCT) { // construct if (bNoArea) { // no area spells } // no area spells else { // any spells } // any spells } // construct else { // other if (bNoArea) { // no area spells } // no area spells else { // any spells if (GetHasSpell(SPELL_METEOR_SWARM,oMe)>0) return SPELL_METEOR_SWARM; else if (GetHasSpell(SPELL_STORM_OF_VENGEANCE,oMe)>0) return SPELL_STORM_OF_VENGEANCE; else if (GetHasSpell(SPELL_IMPLOSION,oMe)>0) return SPELL_IMPLOSION; else if (GetHasSpell(SPELL_POWER_WORD_KILL,oMe)>0) return SPELL_POWER_WORD_KILL; else if (GetHasSpell(SPELL_WAIL_OF_THE_BANSHEE,oMe)>0) return SPELL_WAIL_OF_THE_BANSHEE; else if (GetHasSpell(SPELL_ENERGY_DRAIN,oMe)>0&&d4()<3) return SPELL_ENERGY_DRAIN; else if (GetHasSpell(SPELL_POWER_WORD_KILL,oMe)>0) return SPELL_POWER_WORD_KILL; else if (GetHasSpell(SPELL_BIGBYS_CRUSHING_HAND,oMe)>0&&GetHasSpellEffect(SPELL_BIGBYS_CRUSHING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_CRUSHING_HAND; else if (GetHasSpell(SPELL_DOMINATE_MONSTER,oMe)>0&&GetHasSpellEffect(SPELL_DOMINATE_MONSTER,oTarget)==FALSE&&nCT==CAI_CHARM_MONSTER) return SPELL_DOMINATE_MONSTER; else if (GetHasSpell(SPELL_SUNBURST,oMe)>0) return SPELL_SUNBURST; else if (GetHasSpell(SPELL_SUNBEAM,oMe)>0) return SPELL_SUNBEAM; else if (GetHasSpell(SPELL_INCENDIARY_CLOUD,oMe)>0) return SPELL_INCENDIARY_CLOUD; else if (GetHasSpell(SPELL_FIRE_STORM,oMe)>0) return SPELL_FIRE_STORM; else if (GetHasSpell(SPELL_EARTHQUAKE,oMe)>0) return SPELL_EARTHQUAKE; else if (GetHasSpell(SPELL_MASS_CHARM,oMe)>0&&GetHasSpellEffect(SPELL_MASS_CHARM,oTarget)==FALSE) return SPELL_MASS_CHARM; else if (GetHasSpell(SPELL_MASS_BLINDNESS_AND_DEAFNESS,oMe)>0&&GetHasSpellEffect(SPELL_MASS_BLINDNESS_AND_DEAFNESS,oTarget)==FALSE) return SPELL_MASS_BLINDNESS_AND_DEAFNESS; else if (GetHasSpell(SPELL_BIGBYS_CLENCHED_FIST,oMe)>0&&GetHasSpellEffect(SPELL_BIGBYS_CLENCHED_FIST,oTarget)==FALSE) return SPELL_BIGBYS_CLENCHED_FIST; else if (GetHasSpell(SPELL_HORRID_WILTING,oMe)>0) return SPELL_HORRID_WILTING; else if (GetHasSpell(SPELL_DELAYED_BLAST_FIREBALL,oMe)>0) return SPELL_DELAYED_BLAST_FIREBALL; else if (GetHasSpell(SPELL_FIRE_STORM,oMe)>0) return SPELL_FIRE_STORM; else if (GetHasSpell(SPELL_WORD_OF_FAITH,oMe)>0&&d4()<3) return SPELL_WORD_OF_FAITH; else if (GetHasSpell(SPELL_PRISMATIC_SPRAY,oMe)>0) return SPELL_PRISMATIC_SPRAY; else if (GetHasSpell(SPELL_POWER_WORD_STUN,oMe)>0&&d4()<3) return SPELL_POWER_WORD_STUN; else if (GetHasSpell(SPELL_FINGER_OF_DEATH,oMe)>0) return SPELL_FINGER_OF_DEATH; else if (GetHasSpell(SPELL_DESTRUCTION,oMe)>0) return SPELL_DESTRUCTION; else if (GetHasSpell(SPELL_CREEPING_DOOM,oMe)>0) return SPELL_CREEPING_DOOM; else if (GetHasSpell(SPELL_BIGBYS_GRASPING_HAND,oMe)>0&&GetHasSpellEffect(SPELL_BIGBYS_GRASPING_HAND,oTarget)==FALSE) return SPELL_BIGBYS_GRASPING_HAND; else if (GetHasSpell(SPELL_ACID_FOG,oMe)>0) return SPELL_ACID_FOG; else if (GetHasSpell(SPELL_BLADE_BARRIER,oMe)>0) return SPELL_BLADE_BARRIER; else if (GetHasSpell(SPELL_ISAACS_GREATER_MISSILE_STORM,oMe)>0) return SPELL_ISAACS_GREATER_MISSILE_STORM; else if (GetHasSpell(SPELL_CHAIN_LIGHTNING,oMe)>0) return SPELL_CHAIN_LIGHTNING; else if (GetHasSpell(SPELL_FLESH_TO_STONE,oMe)>0&&GetHasSpellEffect(SPELL_FLESH_TO_STONE,oTarget)==FALSE) return SPELL_FLESH_TO_STONE; else if (GetHasSpell(SPELL_BIGBYS_FORCEFUL_HAND,oMe)>0&&GetHasSpellEffect(SPELL_BIGBYS_FORCEFUL_HAND,oTarget)==FALSE) return SPELL_BIGBYS_FORCEFUL_HAND; } // any spells } // other return 0; } // caiProfessionalOffensive() object caiGetBestObjectToHeal(object oMe) { int nN=1; object oBest=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND,oMe,1,CREATURE_TYPE_IS_ALIVE,TRUE); if(GetIsObjectValid(oBest)) { if(GetDistanceBetween(oMe,oBest) < 10.1) { oBest=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND,oMe,d6(),CREATURE_TYPE_IS_ALIVE,TRUE); while((GetIsObjectValid(oBest)==FALSE||(GetDistanceBetween(oBest,oMe)<10.1&&GetDistanceBetween(oBest,oMe)!=0.0))&&nN<4) { nN++; oBest=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND,oMe,d6(),CREATURE_TYPE_IS_ALIVE,TRUE); } if(GetIsObjectValid(oBest)==FALSE) { oBest=GetNearestCreature(CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_FRIEND,oMe,1,CREATURE_TYPE_IS_ALIVE,TRUE); } if(GetIsObjectValid(oBest)) { nN=GetMaxHitPoints(oBest)-GetCurrentHitPoints(oBest); if((nN>0 || GetIsDead(oBest))) { return oBest; } } return OBJECT_INVALID; } return OBJECT_INVALID; } return OBJECT_INVALID; } //:: FUNCTIONS FROM Deva Bryson Winblood (RTS - Harvester Of Souls) /******************************************************************************/ /******************************************************************************/ //:: FUNCTIONS FROM BIOWARE AND OLANDER int WhatToDoAfterCasting(object oSelf) { object oNearest = GetNearestSeenEnemy(); if(GetBattleCondition(OAI_BLINK_SELF)) { if(Random(100) >= GetLocalInt(OBJECT_SELF, "OAI_BLINK_FAILURE")) { int nD6 = d6(1); if(nD6 == 3 || nD6 == 5) { BlinkMelee(oNearest); return TRUE; } else { BlinkMove(); return TRUE; } } return FALSE; } else if(GetIsObjectValid(oNearest)) { ActionMoveAwayFromObject(oNearest, TRUE, 5.0); DelayCommand(2.0,DetermineCombatRound(oNearest)); return TRUE; } return FALSE; } void UseSpellBuffs(object oCreature = OBJECT_SELF) { SetBattleCondition(OAI_FAST_BUFF_COMPLETE,FALSE); SetBattleCondition(OAI_FAST_BUFF_RANDOM,FALSE); int iX; int HowMany = 0; int iCounter = 0; int iRandomMode; //Fast Buff Complete if(GetBattleCondition(OAI_FAST_BUFF_COMPLETE)) { iRandomMode = FALSE; HowMany = 1; iCounter = 0; } //Fast Buff Random else if(GetBattleCondition(OAI_FAST_BUFF_RANDOM)) { iRandomMode = TRUE; HowMany = ((Random(MyHD) + 1) / 4); if(HowMany > 4) HowMany = 4; } //Essential Buffs if(GetLevelByClass(CLASS_TYPE_BARD)) { while (iCounter < HowMany) { iCounter++; if(iRandomMode) iX = Random(18); switch (iX) { case 0: if(TrySpell(SPELL_AMPLIFY, OBJECT_SELF)) if(iRandomMode) break; case 1: if(TrySpell(SPELL_BULLS_STRENGTH, OBJECT_SELF)) if(iRandomMode) break; case 2: if(TrySpell(SPELL_CATS_GRACE, OBJECT_SELF)) if(iRandomMode) break; case 3: if(TrySpell(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE, OBJECT_SELF)) if(iRandomMode) break; case 4: if(TrySpell(SPELL_CLARITY, OBJECT_SELF)) if(iRandomMode) break; case 5: if(TrySpell(SPELL_DISPLACEMENT, OBJECT_SELF)) if(iRandomMode) break; case 6: if(TrySpell(SPELL_EAGLE_SPLEDOR, OBJECT_SELF)) if(iRandomMode) break; case 7: if(TrySpell(SPELL_ENERGY_BUFFER, OBJECT_SELF)) if(iRandomMode) break; case 8: if(TrySpell(SPELL_ETHEREAL_VISAGE, OBJECT_SELF)) if(iRandomMode) break; case 9: if(TrySpell(SPELL_FOXS_CUNNING, OBJECT_SELF)) if(iRandomMode) break; case 10: if(TrySpell(SPELL_GHOSTLY_VISAGE, OBJECT_SELF)) if(iRandomMode) break; case 11: if(TrySpell(SPELL_HASTE, OBJECT_SELF)) if(iRandomMode) break; case 12: if(TrySpell(SPELL_IMPROVED_INVISIBILITY, OBJECT_SELF)) if(iRandomMode) break; case 13: if(TrySpell(SPELL_INVISIBILITY, OBJECT_SELF)) if(iRandomMode) break; case 14: if(TrySpell(SPELL_MAGE_ARMOR, OBJECT_SELF)) if(iRandomMode) break; case 15: if(TrySpell(SPELL_OWLS_WISDOM, OBJECT_SELF)) if(iRandomMode) break; case 16: if(TrySpell(SPELL_RESISTANCE, OBJECT_SELF)) if(iRandomMode) break; case 17: if(TrySpell(EFFECT_TYPE_ULTRAVISION, OBJECT_SELF)) if(iRandomMode) break; } } return; } //Essential Buffs if(GetLevelByClass(CLASS_TYPE_CLERIC)) { while (iCounter < HowMany) { iCounter++; if(iRandomMode) iX = Random(23); switch (iX) { case 0: if(TrySpell(SPELL_AID, OBJECT_SELF)) if(iRandomMode) break; case 1: if(TrySpell(SPELL_BATTLETIDE, OBJECT_SELF)) if(iRandomMode) break; case 2: if(TrySpell(SPELL_BLESS, OBJECT_SELF)) if(iRandomMode) break; case 3: if(TrySpell(SPELL_BULLS_STRENGTH, OBJECT_SELF)) if(iRandomMode) break; case 4: if(TrySpell(SPELL_CLARITY, OBJECT_SELF)) if(iRandomMode) break; case 5: if(TrySpell(SPELL_DEATH_WARD, OBJECT_SELF)) if(iRandomMode) break; case 6: if(TrySpell(SPELL_EAGLE_SPLEDOR, OBJECT_SELF)) if(iRandomMode) break; case 7: if(TrySpell(SPELL_ENDURANCE, OBJECT_SELF)) if(iRandomMode) break; case 8: if(TrySpell(SPELL_ENDURE_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 9: if(TrySpell(SPELL_ENTROPIC_SHIELD, OBJECT_SELF)) if(iRandomMode) break; case 10: if(TrySpell(SPELL_FOXS_CUNNING, OBJECT_SELF)) if(iRandomMode) break; case 11: if(TrySpell(SPELL_FREEDOM_OF_MOVEMENT, OBJECT_SELF)) if(iRandomMode) break; case 12: if(TrySpell(SPELL_OWLS_WISDOM, OBJECT_SELF)) if(iRandomMode) break; case 13: if(TrySpell(SPELL_PRAYER, OBJECT_SELF)) if(iRandomMode) break; case 14: if(TrySpell(SPELL_PROTECTION_FROM_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 15: if(TrySpell(SPELL_REGENERATE, OBJECT_SELF)) if(iRandomMode) break; case 16: if(TrySpell(SPELL_RESIST_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 17: if(TrySpell(SPELL_RESISTANCE, OBJECT_SELF)) if(iRandomMode) break; case 18: if(TrySpell(SPELL_SHIELD_OF_FAITH, OBJECT_SELF)) if(iRandomMode) break; case 19: if(TrySpell(SPELL_SPELL_RESISTANCE, OBJECT_SELF)) if(iRandomMode) break; case 20: if(TrySpell(SPELL_TRUE_SEEING, OBJECT_SELF)) if(iRandomMode) break; case 21: if(TrySpell(EFFECT_TYPE_ULTRAVISION, OBJECT_SELF)) if(iRandomMode) break; case 22: if(TrySpell(SPELL_VIRTUE, OBJECT_SELF)) if(iRandomMode) break; } } return; } //Essential Buffs if(GetLevelByClass(CLASS_TYPE_DRUID)) { while (iCounter < HowMany) { iCounter++; if(iRandomMode) iX = Random(20); switch (iX) { case 0: if(TrySpell(SPELL_AURA_OF_VITALITY, OBJECT_SELF)) if(iRandomMode) break; case 1: if(TrySpell(SPELL_BARKSKIN, OBJECT_SELF)) if(iRandomMode) break; case 2: if(TrySpell(SPELL_BULLS_STRENGTH, OBJECT_SELF)) if(iRandomMode) break; case 3: if(TrySpell(SPELL_DEATH_WARD, OBJECT_SELF)) if(iRandomMode) break; case 4: if(TrySpell(SPELL_ENDURE_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 5: if(TrySpell(SPELL_ENERGY_BUFFER, OBJECT_SELF)) if(iRandomMode) break; case 6: if(TrySpell(SPELL_FREEDOM_OF_MOVEMENT, OBJECT_SELF)) if(iRandomMode) break; case 7: if(TrySpell(SPELL_GREATER_STONESKIN, OBJECT_SELF)) if(iRandomMode) break; case 8: if(TrySpell(SPELL_ONE_WITH_THE_LAND, OBJECT_SELF)) if(iRandomMode) break; case 9: if(TrySpell(438, OBJECT_SELF)) if(iRandomMode) break; //Owl's Insight case 10: if(TrySpell(SPELL_PREMONITION, OBJECT_SELF)) if(iRandomMode) break; case 11: if(TrySpell(SPELL_PROTECTION_FROM_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 12: if(TrySpell(SPELL_REGENERATE, OBJECT_SELF)) if(iRandomMode) break; case 13: if(TrySpell(SPELL_RESIST_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 14: if(TrySpell(SPELL_RESISTANCE, OBJECT_SELF)) if(iRandomMode) break; case 15: if(TrySpell(SPELL_SPELL_RESISTANCE, OBJECT_SELF)) if(iRandomMode) break; case 16: if(TrySpell(SPELL_STONESKIN, OBJECT_SELF)) if(iRandomMode) break; case 17: if(TrySpell(SPELL_TRUE_SEEING, OBJECT_SELF)) if(iRandomMode) break; case 18: if(TrySpell(EFFECT_TYPE_ULTRAVISION, OBJECT_SELF)) if(iRandomMode) break; case 19: if(TrySpell(SPELL_VIRTUE, OBJECT_SELF)) if(iRandomMode) break; } } return; } //Essential Buffs if(GetLevelByClass(CLASS_TYPE_PALADIN)) { while (iCounter < HowMany) { iCounter++; if(iRandomMode) iX = Random(13); switch (iX) { case 0: if(TrySpell(SPELL_AID, OBJECT_SELF)) if(iRandomMode) break; case 1: if(TrySpell(SPELL_AURAOFGLORY, OBJECT_SELF)) if(iRandomMode) break; case 2: if(TrySpell(SPELL_BLESS, OBJECT_SELF)) if(iRandomMode) break; case 3: if(TrySpell(SPELL_BULLS_STRENGTH, OBJECT_SELF)) if(iRandomMode) break; case 4: if(TrySpell(SPELL_CAMOFLAGE, OBJECT_SELF)) if(iRandomMode) break; case 5: if(TrySpell(SPELL_DEATH_WARD, OBJECT_SELF)) if(iRandomMode) break; case 6: if(TrySpell(SPELL_EAGLE_SPLEDOR, OBJECT_SELF)) if(iRandomMode) break; case 7: if(TrySpell(SPELL_ENDURE_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 8: if(TrySpell(SPELL_FREEDOM_OF_MOVEMENT, OBJECT_SELF)) if(iRandomMode) break; case 9: if(TrySpell(SPELL_PRAYER, OBJECT_SELF)) if(iRandomMode) break; case 10: if(TrySpell(SPELL_RESIST_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 11: if(TrySpell(SPELL_RESISTANCE, OBJECT_SELF)) if(iRandomMode) break; case 12: if(TrySpell(SPELL_VIRTUE, OBJECT_SELF)) if(iRandomMode) break; } } return; } //Essential Buffs if(GetLevelByClass(CLASS_TYPE_RANGER)) { while (iCounter < HowMany) { iCounter++; if(iRandomMode) iX = Random(8); switch (iX) { case 0: if(TrySpell(SPELL_AID, OBJECT_SELF)) if(iRandomMode) break; case 1: if(TrySpell(SPELL_CAMOFLAGE, OBJECT_SELF)) if(iRandomMode) break; case 2: if(TrySpell(SPELL_CATS_GRACE, OBJECT_SELF)) if(iRandomMode) break; case 3: if(TrySpell(SPELL_FREEDOM_OF_MOVEMENT, OBJECT_SELF)) if(iRandomMode) break; case 4: if(TrySpell(SPELL_ONE_WITH_THE_LAND, OBJECT_SELF)) if(iRandomMode) break; case 5: if(TrySpell(SPELL_PROTECTION_FROM_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 6: if(TrySpell(SPELL_RESIST_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 7: if(TrySpell(EFFECT_TYPE_ULTRAVISION, OBJECT_SELF)) if(iRandomMode) break; } } return; } //Essential Buffs if(GetLevelByClass(CLASS_TYPE_SORCERER) || GetLevelByClass(CLASS_TYPE_WIZARD)) { while (iCounter < HowMany) { iCounter++; if(iRandomMode) iX = Random(37); switch (iX) { case 0: if(TrySpell(SPELL_BULLS_STRENGTH, OBJECT_SELF)) if(iRandomMode) break; case 1: if(TrySpell(SPELL_CATS_GRACE, OBJECT_SELF)) if(iRandomMode) break; case 2: if(TrySpell(SPELL_CLAIRAUDIENCE_AND_CLAIRVOYANCE, OBJECT_SELF)) if(iRandomMode) break; case 3: if(TrySpell(SPELL_CLARITY, OBJECT_SELF)) if(iRandomMode) break; case 4: if(TrySpell(SPELL_DEATH_ARMOR, OBJECT_SELF)) if(iRandomMode) break; case 5: if(TrySpell(SPELL_DISPLACEMENT, OBJECT_SELF)) if(iRandomMode) break; case 6: if(TrySpell(SPELL_EAGLE_SPLEDOR, OBJECT_SELF)) if(iRandomMode) break; case 7: if(TrySpell(SPELL_ELEMENTAL_SHIELD, OBJECT_SELF)) if(iRandomMode) break; case 8: if(TrySpell(SPELL_ENDURANCE, OBJECT_SELF)) if(iRandomMode) break; case 9: if(TrySpell(SPELL_ENDURE_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 10: if(TrySpell(SPELL_ENERGY_BUFFER, OBJECT_SELF)) if(iRandomMode) break; case 11: if(TrySpell(SPELL_ETHEREAL_VISAGE, OBJECT_SELF)) if(iRandomMode) break; case 12: if(TrySpell(SPELL_FOXS_CUNNING, OBJECT_SELF)) if(iRandomMode) break; case 13: if(TrySpell(SPELL_GHOSTLY_VISAGE, OBJECT_SELF)) if(iRandomMode) break; case 14: if(TrySpell(SPELL_GLOBE_OF_INVULNERABILITY, OBJECT_SELF)) if(iRandomMode) break; case 15: if(TrySpell(SPELL_GREATER_STONESKIN, OBJECT_SELF)) if(iRandomMode) break; case 16: if(TrySpell(SPELL_HASTE, OBJECT_SELF)) if(iRandomMode) break; case 17: if(TrySpell(SPELL_IMPROVED_INVISIBILITY, OBJECT_SELF)) if(iRandomMode) break; case 18: if(TrySpell(SPELL_INVISIBILITY, OBJECT_SELF)) if(iRandomMode) break; case 19: if(TrySpell(SPELL_IRONGUTS, OBJECT_SELF)) if(iRandomMode) break; case 20: if(TrySpell(SPELL_LESSER_MIND_BLANK, OBJECT_SELF)) if(iRandomMode) break; case 21: if(TrySpell(SPELL_LESSER_SPELL_MANTLE, OBJECT_SELF)) if(iRandomMode) break; case 22: if(TrySpell(SPELL_MAGE_ARMOR, OBJECT_SELF)) if(iRandomMode) break; case 23: if(TrySpell(SPELL_MIND_BLANK, OBJECT_SELF)) if(iRandomMode) break; case 24: if(TrySpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY, OBJECT_SELF)) if(iRandomMode) break; case 25: if(TrySpell(SPELL_OWLS_WISDOM, OBJECT_SELF)) if(iRandomMode) break; case 26: if(TrySpell(SPELL_PREMONITION, OBJECT_SELF)) if(iRandomMode) break; case 27: if(TrySpell(SPELL_PROTECTION_FROM_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 28: if(TrySpell(SPELL_PROTECTION_FROM_SPELLS, OBJECT_SELF)) if(iRandomMode) break; case 29: if(TrySpell(SPELL_RESIST_ELEMENTS, OBJECT_SELF)) if(iRandomMode) break; case 30: if(TrySpell(SPELL_RESISTANCE, OBJECT_SELF)) if(iRandomMode) break; case 31: if(TrySpell(SPELL_SHADOW_SHIELD, OBJECT_SELF)) if(iRandomMode) break; case 32: if(TrySpell(SPELL_SHIELD, OBJECT_SELF)) if(iRandomMode) break; case 33: if(TrySpell(SPELL_SPELL_MANTLE, OBJECT_SELF)) if(iRandomMode) break; case 34: if(TrySpell(SPELL_STONESKIN, OBJECT_SELF)) if(iRandomMode) break; case 35: if(TrySpell(SPELL_TRUE_SEEING, OBJECT_SELF)) if(iRandomMode) break; case 36: if(TrySpell(EFFECT_TYPE_ULTRAVISION, OBJECT_SELF)) if(iRandomMode) break; } } return; } } int OAI_AdvancedBuff(float fDistance, int bInstant = TRUE) { SetBattleCondition(OAI_FAST_BUFF_ADVANCED,FALSE); object oNPC = GetNearestEnemy(); if(GetIsObjectValid(oNPC)) { if(GetDistanceToObject(oNPC) <= fDistance) { if(!GetIsFighting(OBJECT_SELF)) { ClearAllActions(); //Combat Protections if(GetHasSpell(SPELL_PREMONITION) && !GetHasSpellEffect(SPELL_PREMONITION)) { ActionCastSpellAtObject(SPELL_PREMONITION, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_GREATER_STONESKIN)&& !GetHasSpellEffect(SPELL_GREATER_STONESKIN)) { ActionCastSpellAtObject(SPELL_GREATER_STONESKIN, OBJECT_SELF, METAMAGIC_NONE, 0, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_STONESKIN)&& !GetHasSpellEffect(SPELL_STONESKIN)) { ActionCastSpellAtObject(SPELL_STONESKIN, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } //Visage Protections if(GetHasSpell(SPELL_SHADOW_SHIELD)&& !GetHasSpellEffect(SPELL_SHADOW_SHIELD)) { ActionCastSpellAtObject(SPELL_SHADOW_SHIELD, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_ETHEREAL_VISAGE)&& !GetHasSpellEffect(SPELL_ETHEREAL_VISAGE)) { ActionCastSpellAtObject(SPELL_ETHEREAL_VISAGE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_GHOSTLY_VISAGE)&& !GetHasSpellEffect(SPELL_GHOSTLY_VISAGE)) { ActionCastSpellAtObject(SPELL_GHOSTLY_VISAGE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } //Mantle Protections if(GetHasSpell(SPELL_GREATER_SPELL_MANTLE)&& !GetHasSpellEffect(SPELL_GREATER_SPELL_MANTLE)) { ActionCastSpellAtObject(SPELL_GREATER_SPELL_MANTLE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SPELL_MANTLE)&& !GetHasSpellEffect(SPELL_SPELL_MANTLE)) { ActionCastSpellAtObject(SPELL_SPELL_MANTLE, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_LESSER_SPELL_BREACH)&& !GetHasSpellEffect(SPELL_LESSER_SPELL_BREACH)) { ActionCastSpellAtObject(SPELL_LESSER_SPELL_BREACH, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } // Globes if(GetHasSpell(SPELL_GLOBE_OF_INVULNERABILITY)&& !GetHasSpellEffect(SPELL_GLOBE_OF_INVULNERABILITY)) { ActionCastSpellAtObject(SPELL_GLOBE_OF_INVULNERABILITY, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_MINOR_GLOBE_OF_INVULNERABILITY)&& !GetHasSpellEffect(SPELL_MINOR_GLOBE_OF_INVULNERABILITY)) { ActionCastSpellAtObject(SPELL_MINOR_GLOBE_OF_INVULNERABILITY, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } //Misc Protections if(GetHasSpell(SPELL_ELEMENTAL_SHIELD)&& !GetHasSpellEffect(SPELL_ELEMENTAL_SHIELD)) { ActionCastSpellAtObject(SPELL_ELEMENTAL_SHIELD, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if (GetHasSpell(SPELL_MESTILS_ACID_SHEATH)&& !GetHasSpellEffect(SPELL_MESTILS_ACID_SHEATH)) { ActionCastSpellAtObject(SPELL_MESTILS_ACID_SHEATH, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if (GetHasSpell(SPELL_DEATH_ARMOR)&& !GetHasSpellEffect(SPELL_DEATH_ARMOR)) { ActionCastSpellAtObject(SPELL_DEATH_ARMOR, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } //Elemental Protections if(GetHasSpell(SPELL_PROTECTION_FROM_ELEMENTS)&& !GetHasSpellEffect(SPELL_PROTECTION_FROM_ELEMENTS)) { ActionCastSpellAtObject(SPELL_PROTECTION_FROM_ELEMENTS, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_RESIST_ELEMENTS)&& !GetHasSpellEffect(SPELL_RESIST_ELEMENTS)) { ActionCastSpellAtObject(SPELL_RESIST_ELEMENTS, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_ENDURE_ELEMENTS)&& !GetHasSpellEffect(SPELL_ENDURE_ELEMENTS)) { ActionCastSpellAtObject(SPELL_ENDURE_ELEMENTS, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } //Mental Protections if(GetHasSpell(SPELL_MIND_BLANK)&& !GetHasSpellEffect(SPELL_MIND_BLANK)) { ActionCastSpellAtObject(SPELL_MIND_BLANK, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_LESSER_MIND_BLANK)&& !GetHasSpellEffect(SPELL_LESSER_MIND_BLANK)) { ActionCastSpellAtObject(SPELL_LESSER_MIND_BLANK, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_CLARITY)&& !GetHasSpellEffect(SPELL_CLARITY)) { ActionCastSpellAtObject(SPELL_CLARITY, OBJECT_SELF, METAMAGIC_NONE, FALSE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } //Summon Ally if(GetHasSpell(SPELL_BLACK_BLADE_OF_DISASTER)) { ActionCastSpellAtLocation(SPELL_BLACK_BLADE_OF_DISASTER, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_IX)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_IX, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_VIII)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_VIII, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_VII)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_VII, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_VI)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_VI, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_V)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_V, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_IV)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_IV, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_III)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_III, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_II)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_II, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } else if(GetHasSpell(SPELL_SUMMON_CREATURE_I)) { ActionCastSpellAtLocation(SPELL_SUMMON_CREATURE_I, GetLocation(OBJECT_SELF), METAMAGIC_NONE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, bInstant); } return TRUE; } } } return FALSE; } void CastAuras() { TrySpell(SPELLABILITY_AURA_MENACE, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_UNNATURAL, OBJECT_SELF); TrySpell(SPELLABILITY_TYRANT_FOG_MIST, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_FIRE, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_ELECTRICITY, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_COLD, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_FEAR, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_PROTECTION, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_BLINDING, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_STUN, OBJECT_SELF); TrySpell(SPELLABILITY_AURA_UNEARTHLY_VISAGE, OBJECT_SELF); TrySpell(SPELLABILITY_DRAGON_FEAR, OBJECT_SELF); SetBattleCondition(OAI_CAST_AURAS_NOW,FALSE); } int OAI_UseTurning() { int nCount; if(GetHasFeat(FEAT_TURN_UNDEAD)) { object oUndead = GetNearestPerceivedEnemy(); int nHD = GetHitDice(oUndead); if(GetHasEffect(EFFECT_TYPE_TURNED, oUndead) || GetHitDice(OBJECT_SELF) <= nHD) return FALSE; int nElemental = GetHasFeat(FEAT_AIR_DOMAIN_POWER) + GetHasFeat(FEAT_EARTH_DOMAIN_POWER) + GetHasFeat(FEAT_FIRE_DOMAIN_POWER) + GetHasFeat(FEAT_WATER_DOMAIN_POWER); int nVermin = GetHasFeat(FEAT_PLANT_DOMAIN_POWER) + GetHasFeat(FEAT_ANIMAL_COMPANION); int nConstructs = GetHasFeat(FEAT_DESTRUCTION_DOMAIN_POWER); int nOutsider = GetHasFeat(FEAT_GOOD_DOMAIN_POWER) + GetHasFeat(FEAT_EVIL_DOMAIN_POWER) + GetHasFeat(854);// planar turning if(nElemental == TRUE) nCount += GetRacialTypeCount(RACIAL_TYPE_ELEMENTAL); if(nVermin == TRUE) nCount += GetRacialTypeCount(RACIAL_TYPE_VERMIN); if(nOutsider == TRUE) nCount += GetRacialTypeCount(RACIAL_TYPE_OUTSIDER); if(nConstructs == TRUE) nCount += GetRacialTypeCount(RACIAL_TYPE_CONSTRUCT); nCount += GetRacialTypeCount(RACIAL_TYPE_UNDEAD); if(nCount > 0) { ClearAllActions(); ActionUseFeat(FEAT_TURN_UNDEAD, OBJECT_SELF); return TRUE; } } return FALSE; } void OAI_Fighting(object oTarget) { switch(Random(64)) { case 0: PlayVoiceChat(VOICE_CHAT_TAUNT); break; case 1: PlayVoiceChat(VOICE_CHAT_THREATEN); break; case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break; case 3: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break; case 4: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break; case 5: PlayVoiceChat(VOICE_CHAT_GATTACK1); break; case 6: PlayVoiceChat(VOICE_CHAT_GATTACK2); break; case 7: PlayVoiceChat(VOICE_CHAT_GATTACK3); break; } int nAC = GetAC(oTarget); float fAttack; int nAttack = GetHitDice(OBJECT_SELF); fAttack = (IntToFloat(nAttack) * 0.75) + IntToFloat(GetAbilityModifier(ABILITY_STRENGTH)); int nDiff = nAC - nAttack; ClearAllActions(); if(OAI_IsOutOfAmmo()) OAI_EquipAppropriateWeapons(); // No weapons is out of ammo if(GetBattleCondition(OAI_BLINK_SELF)) { if(Random(100) >= GetLocalInt(OBJECT_SELF, "OAI_BLINK_FAILURE")) BlinkMelee(oTarget); } //For Harpers if(GetHasFeat(FEAT_TYMORAS_SMILE) && !GetHasSpellEffect(478)) { ActionUseFeat(FEAT_TYMORAS_SMILE, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_TYMORAS_SMILE); } //For Smiters if(GetStatusCondition(OAI_I_CAN_SMITE_MELEE)) { if(GetDistanceToObject(oTarget) < 5.0 && d3() == 1) { MeleeSmite(oTarget); return; } } //For Divine Combat if(GetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE)) { if(GetDistanceToObject(oTarget) < 5.0 && d2() == 1) { MeleeReligious(oTarget); return; } } //For the Ambushers if(GetStatusCondition(OAI_I_CAN_SNEAK_MELEE)) { if(GetDistanceToObject(oTarget) < 5.0 && d2() == 1) { MeleeSneak(oTarget); return; } } //For the Weaponmasters if(GetStatusCondition(OAI_I_CAN_WM_MELEE)) { if(GetDistanceToObject(oTarget) < 5.0 && d2() == 1) { MeleeWeaponMaster(oTarget); return; } } //Palemasters Always Try to Fight like a Palemaster if(GetStatusCondition(OAI_I_CAN_PM_MELEE)){ MeleePalemaster(oTarget); return;} //For the Red Dragon Disciples if(GetStatusCondition(OAI_I_CAN_RDD_MELEE)) { if(GetDistanceToObject(oTarget) < 5.0 && d2() == 1) { MeleeRDD(oTarget); return; } } //Shifters Always Fight Like a Shifter if(GetStatusCondition(OAI_I_CAN_SHIFTER_MELEE)){ MeleeShifter(oTarget); return;} //For Ranged Attacks if(GetStatusCondition(OAI_I_CAN_FIGHT_RANGED)) { if(GetDistanceToObject(oTarget) > 5.0 || GetHasFeat(FEAT_POINT_BLANK_SHOT)) { RangedCombat(oTarget); return; } } //Monks Always Fight Like Monks if(GetStatusCondition(OAI_I_CAN_MONK_MELEE)){ MeleeMonk(oTarget); return;} //General Fight Stuff MeleeGeneral(oTarget); } void SummonHordes() { string sResRef = GetLocalString(OBJECT_SELF, "OAI_SUMMON"); if(GetStringLength(sResRef) < 1) return; if(Random(100) < GetLocalInt(OBJECT_SELF, "OAI_SUMMON_FAILURE")) return; int iX, iY; vector vMe = GetPosition(OBJECT_SELF); while(iX==0 && iY==0) { iX = (Random(3) - 1) * 15; iY = (Random(3) - 1) * 15; } vMe.x += IntToFloat(iX); vMe.y += IntToFloat(iY); location lNew = Location(oArea, vMe, GetFacing(OBJECT_SELF)); object oNew = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lNew); ExecuteScript("oai_entercombat", oNew); } int CastRezOn(object oTarget) { if(GetHasSpell(SPELL_RESURRECTION, oTarget)) { ActionCastSpellAtObject(SPELL_RESURRECTION, oTarget); if(d2() == 1) ActionDoCommand(PlayVoiceChat(VOICE_CHAT_THANKS, oTarget)); return TRUE; } if(GetHasSpell(SPELL_RAISE_DEAD, oTarget)) { ActionCastSpellAtObject(SPELL_RAISE_DEAD, oTarget); if(d2() == 1) ActionDoCommand(PlayVoiceChat(VOICE_CHAT_THANKS, oTarget)); return TRUE; } //No Spells...So Nor More Checks SetStatusCondition(OAI_I_CAN_RAISE_DEAD, FALSE); return FALSE; } int DetermineAllyToRez() { if(!GetStatusCondition(OAI_I_CAN_RAISE_DEAD)) return FALSE; object oAlly = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND, OBJECT_SELF, 1, CREATURE_TYPE_IS_ALIVE, FALSE); //For Henchman Death Objects string sDOTag = GetTag(oAlly); if(sDOTag == "HB_HenchDead") { if(CastRezOn(oAlly)) return TRUE; return FALSE; } if(GetIsObjectValid(oAlly) && GetDistanceToObject(oAlly) < 30.0) { if(CastRezOn(oAlly)) return TRUE; } return FALSE; } void CastTriggers() { if(GetBattleCondition(OAI_TRIGGER_HAS_BEEN_CAST)) return; SetBattleCondition(OAI_TRIGGER_HAS_BEEN_CAST); //Battlecries! switch (Random(12)) { case 0: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break; case 1: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break; case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break; case 3: PlayVoiceChat(VOICE_CHAT_ATTACK); break; } //Setting the following variable automatically casts the auras if(GetBattleCondition(OAI_CAST_AURAS_NOW)) CastAuras(); //Buffing Flags if(GetBattleCondition(OAI_FAST_BUFF_COMPLETE)) UseSpellBuffs(); if(GetBattleCondition(OAI_FAST_BUFF_ADVANCED)) OAI_AdvancedBuff(40.0); if(GetBattleCondition(OAI_FAST_BUFF_RANDOM)) UseSpellBuffs(); //Cast Summoning Creature if(GetBattleCondition(OAI_FAST_BUFF_SUMMON)) { if(TalentSummonAllies() == TRUE) { SetStatusCondition(OAI_I_CAN_SUMMON, FALSE); } else SetStatusCondition(OAI_I_CAN_SUMMON, FALSE); } //If the NPC Has Polymorph it Will Do It if(!GetHasEffect(EFFECT_TYPE_POLYMORPH, OBJECT_SELF)) { if(GetStatusCondition(OAI_I_CAN_POLYMORPH)) { //Shifters Do Their Own Thing if(!GetStatusCondition(OAI_I_CAN_SHIFTER_MELEE)) { //Manual Shapechange Setting int nPoly = GetLocalInt(OBJECT_SELF, "OAI_SHAPECHANGE"); if(nPoly > 0) { effect eShape = SupernaturalEffect(EffectPolymorph(GetLocalInt(OBJECT_SELF, "OAI_SHAPECHANGE") - 1)); effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD); DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eShape, OBJECT_SELF)); DelayCommand(1.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(OBJECT_SELF))); DeleteLocalInt(OBJECT_SELF, "OAI_SHAPECHANGE"); SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); } else { if(TrySpell(SPELL_POLYMORPH_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); } } } } } } int IsUnderMeleeAttack(object oWho = OBJECT_SELF) { int nNth = 1; object oTarget = GetNearestEnemy(oWho,nNth); while(GetIsObjectValid(oTarget) && GetDistanceBetween(oWho, oTarget) < 3.0) { nNth++; if(GetAttackTarget(oTarget) == oWho) return TRUE; oTarget = GetNearestEnemy(oWho,nNth); } return FALSE; } int ManageEnemyAOE() { object oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT); if(!GetIsObjectValid(oAOE) || GetDistanceToObject(oAOE) > 40.0) return FALSE; object oO = GetAreaOfEffectCreator(oAOE); if(GetIsObjectValid(oO) && !GetIsEnemy(oO)) { oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, OBJECT_SELF, 2); if(!GetIsObjectValid(oAOE) || GetDistanceToObject(oAOE) > 40.0) return FALSE; object oO = GetAreaOfEffectCreator(oAOE); if(GetIsObjectValid(oO) && !GetIsEnemy(oO)) { oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, OBJECT_SELF, 3); if(!GetIsObjectValid(oAOE) || GetDistanceToObject(oAOE) > 40.0) return FALSE; object oO = GetAreaOfEffectCreator(oAOE); if(GetIsObjectValid(oO) && !GetIsEnemy(oO)) return FALSE; } } location lTarget = GetLocation(oAOE); if(GetHasSpell(SPELL_GUST_OF_WIND, OBJECT_SELF)) { ActionCastSpellAtLocation(SPELL_GUST_OF_WIND,lTarget); ActionDoCommand(ExecuteScript("oai_entercombat", OBJECT_SELF)); return TRUE; } if(GetHasSpell(SPELL_MORDENKAINENS_DISJUNCTION, OBJECT_SELF)) { ActionCastSpellAtLocation(SPELL_MORDENKAINENS_DISJUNCTION,lTarget); ActionDoCommand(ExecuteScript("oai_entercombat", OBJECT_SELF)); return TRUE; } if(GetHasSpell(SPELL_GREATER_DISPELLING, OBJECT_SELF)) { ActionCastSpellAtLocation(SPELL_GREATER_DISPELLING,lTarget); ActionDoCommand(ExecuteScript("oai_entercombat", OBJECT_SELF)); return TRUE; } if(GetHasSpell(SPELL_DISPEL_MAGIC, OBJECT_SELF)) { ActionCastSpellAtLocation(SPELL_DISPEL_MAGIC,lTarget); ActionDoCommand(ExecuteScript("oai_entercombat", OBJECT_SELF)); return TRUE; } if(GetHasSpell(SPELL_LESSER_DISPEL, OBJECT_SELF)) { ActionCastSpellAtLocation(SPELL_LESSER_DISPEL,lTarget); ActionDoCommand(ExecuteScript("oai_entercombat", OBJECT_SELF)); return TRUE; } return FALSE; } int DragonWingBuffet(object oIntruder) { if(GetCreatureSize(oIntruder) == CREATURE_SIZE_HUGE || GetDistanceToObject(oIntruder) > RADIUS_SIZE_GARGANTUAN) return FALSE; effect eKnockDown = EffectKnockdown(); int nDamage = Random(GetHitDice(OBJECT_SELF)) + 11; int nDC = GetHitDice(OBJECT_SELF); effect eDam = EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING); effect eVis = EffectVisualEffect(VFX_IMP_PULSE_WIND); float fDelay; ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); eVis = EffectVisualEffect(VFX_FNF_SCREEN_SHAKE); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); location lSelf = GetLocation(OBJECT_SELF); effect eAppear = EffectAppear(); ApplyEffectToObject(DURATION_TYPE_INSTANT, eAppear, OBJECT_SELF); object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, lSelf); while(GetIsObjectValid(oTarget)) { fDelay = GetDistanceToObject(oTarget)/20.0; if(!GetIsFriend(oTarget)) { if(GetCreatureSize(oTarget) < CREATURE_SIZE_HUGE) { if(!ReflexSave(oTarget, nDC)) { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockDown, oTarget, 6.0)); } } } oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, lSelf); } return TRUE; } int SpecialDragonStuff(object oIntruder) { int iWing = GetLocalInt(OBJECT_SELF, "OAI_WING_BUFFET"); iWing++; SetLocalInt(OBJECT_SELF, "OAI_WING_BUFFET", iWing); switch (Random(64)) { case 0: PlayVoiceChat(VOICE_CHAT_TAUNT); break; case 1: PlayVoiceChat(VOICE_CHAT_THREATEN); break; case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break; case 3: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break; case 4: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break; case 5: PlayVoiceChat(VOICE_CHAT_GATTACK1); break; case 6: PlayVoiceChat(VOICE_CHAT_GATTACK2); break; case 7: PlayVoiceChat(VOICE_CHAT_GATTACK3); break; } //Anti-Undead Combat if(GetRacialType(oIntruder) == RACIAL_TYPE_UNDEAD) { if(TrySpell(SPELL_MASS_HEAL,oIntruder)) return TRUE; if(TrySpell(SPELL_HEAL,oIntruder)) return TRUE; if(TrySpell(SPELL_CURE_CRITICAL_WOUNDS,oIntruder)) return TRUE; if(TrySpell(SPELL_CURE_SERIOUS_WOUNDS,oIntruder)) return TRUE; if(TrySpell(SPELL_CURE_MODERATE_WOUNDS,oIntruder)) return TRUE; } //Check Health Status int nStatus = GetCurrentHitPoints(OBJECT_SELF) * 2; int nBase = GetMaxHitPoints(OBJECT_SELF); if(nStatus < nBase) { if(TalentHealingSelf() == TRUE) return TRUE; } if(TalentAdvancedProtectSelf() == TRUE) return TRUE; if(TalentDragonCombat(oIntruder) == TRUE) return TRUE; if(iWing > (2 + Random(3))) { if(DragonWingBuffet(oIntruder)) { SetLocalInt(OBJECT_SELF, "OAI_WING_BUFFET", 0); return TRUE; } } return FALSE; } void SpecialBeholderStuff(object oFoe) { int D2 = d2(); switch (Random(64)) { case 0: PlayVoiceChat(VOICE_CHAT_TAUNT); break; case 1: PlayVoiceChat(VOICE_CHAT_THREATEN); break; case 2: PlayVoiceChat(VOICE_CHAT_BATTLECRY1); break; case 3: PlayVoiceChat(VOICE_CHAT_BATTLECRY2); break; case 4: PlayVoiceChat(VOICE_CHAT_BATTLECRY3); break; case 5: PlayVoiceChat(VOICE_CHAT_GATTACK1); break; case 6: PlayVoiceChat(VOICE_CHAT_GATTACK2); break; case 7: PlayVoiceChat(VOICE_CHAT_GATTACK3); break; } //Special Beholder Attacks if(D2 == 1 && (GetHasSpell(SPELLABILITY_EYEBALL_COLD_RAY) || GetHasSpell(SPELLABILITY_EYEBALL_WOUND_RAY) || GetHasSpell(SPELLABILITY_EYEBALL_FIRE_RAY))) { OAI_EyeballRayAttack(oFoe); return; } if(D2 == 2 && (GetHasSpell(SPELLABILITY_BEHOLDER_SPECIAL_SPELL_AI))) { OAI_BeholderRayAttack(oFoe); return; } //Get the Auras Up CastAuras(); //Spells DetermineCombatRound(oFoe); } void OAI_EyeballRayAttack(object oTarget = OBJECT_SELF) { if(!GetHasSpell(SPELLABILITY_EYEBALL_COLD_RAY) && !GetHasSpell(SPELLABILITY_EYEBALL_WOUND_RAY) && !GetHasSpell(SPELLABILITY_EYEBALL_FIRE_RAY)) return; int nMax = d3(); int nNum,nRay; int nTally = 1; //Try to fire a randomly chosen ray. while(nTally <= nMax) { nNum = d3(); switch(nNum) { case 1: nRay = SPELLABILITY_EYEBALL_COLD_RAY; break; case 2: nRay = SPELLABILITY_EYEBALL_WOUND_RAY; break; case 3: nRay = SPELLABILITY_EYEBALL_FIRE_RAY; break; } nTally++; if(TrySpell(nRay, oTarget)) return; } } void OAI_BeholderRayAttack(object oTarget = OBJECT_SELF) { if(!GetHasSpell(SPELLABILITY_BEHOLDER_SPECIAL_SPELL_AI)) return; TrySpell(SPELLABILITY_BEHOLDER_ANTIMAGIC_CONE, oTarget); int nMax = d3(); int nNum,nRay; int nTally = 1; //Try to fire a randomly chosen ray. while(nTally <= nMax) { nNum = Random(7) + 1; switch(nNum) { case 1: nRay = SPELLABILITY_BEHOLDER_DEATH_RAY; break; case 2: nRay = SPELLABILITY_BEHOLDER_SLOW_RAY; break; case 3: nRay = SPELLABILITY_BEHOLDER_PETRIFY_RAY; break; case 4: nRay = SPELLABILITY_BEHOLDER_KNOCKDOWN_RAY; break; case 5: nRay = SPELLABILITY_BEHOLDER_CHARM_RAY; break; case 6: nRay = SPELLABILITY_BEHOLDER_WOUND_RAY; break; case 7: nRay = SPELLABILITY_BEHOLDER_FEAR_RAY; break; } nTally++; if(TrySpell(nRay, oTarget)) return; } DecrementRemainingSpellUses(OBJECT_SELF, SPELLABILITY_BEHOLDER_SPECIAL_SPELL_AI); } /******************************************************************************/ //:: ENGULF CODE ORIGINALLY FROM LEGACY AI V1.19 BY CENOTAPH void SpecialGelatinousCubeStuff(object oFoe) { if(OAI_CheckEngulf(oFoe)) return; DetermineCombatRound(oFoe); } int OAI_CheckEngulf(object oTarget = OBJECT_SELF) { if(!GetIsTargetInMeleeRange(oTarget)) return FALSE; //Move directly on top of target. ClearAllActions(); ActionMoveToLocation(GetLocation(oTarget),TRUE); ActionDoCommand(OAI_Engulf()); return TRUE; } void OAI_Engulf(int nEngulf = TRUE) { location lLoc = GetLocation(OBJECT_SELF); object oVictim = GetFirstObjectInShape(SHAPE_CUBE,2.0,lLoc,FALSE,OBJECT_TYPE_CREATURE); while(oVictim!=OBJECT_INVALID) { if(oVictim!=OBJECT_SELF) { if(!nEngulf) { OAI_RemoveEffects(oVictim,OBJECT_SELF,EFFECT_TYPE_ETHEREAL); } if(!GetHasEffect(EFFECT_TYPE_CUTSCENEGHOST,oVictim) && GetCreatureSize(oVictim) != CREATURE_SIZE_HUGE) { OAI_EngulfVictim(oVictim); } } oVictim = GetNextObjectInShape(SHAPE_CUBE,2.0,lLoc,FALSE,OBJECT_TYPE_CREATURE); } if(!nEngulf) OAI_RemoveEffects(OBJECT_SELF,OBJECT_SELF,EFFECT_TYPE_CUTSCENEIMMOBILIZE); } void OAI_EngulfVictim(object oVictim) { //Target won throw: exit. if(ReflexSave(oVictim,17+GetHitDice(OBJECT_SELF)-4) != 0) { ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_REFLEX_SAVE_THROW_USE),oVictim); return; } FloatingTextStringOnCreature("Digested!",oVictim); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(d6(),DAMAGE_TYPE_ACID),oVictim); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_ACID_S),oVictim); //Try for paralysis. if(GetIsImmune(oVictim,IMMUNITY_TYPE_PARALYSIS) || FortitudeSave(oVictim,16,SAVING_THROW_TYPE_POISON)!=0) return; FloatingTextStringOnCreature("Engulfed!",oVictim); effect eEngulf = EffectLinkEffects(EffectVisualEffect(VFX_DUR_PARALYZED), EffectParalyze()); eEngulf = EffectLinkEffects(EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), eEngulf); eEngulf = EffectLinkEffects(EffectEthereal(),eEngulf); float fTime = 7.0; ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEngulf,oVictim,fTime); //Immobilize the engulfer for the time period as well, to keep them from //moving off their engulfed prey which would look really stupid. ApplyEffectToObject(DURATION_TYPE_TEMPORARY,SupernaturalEffect(EffectCutsceneImmobilize()),OBJECT_SELF,fTime); } //:: ENGULF CODE ORIGINALLY FROM LEGACY AI V1.19 BY CENOTAPH /******************************************************************************/ /******************************************************************************/ //:: TROLL CODE ORIGINALLY BY ULIAS //:: NEW TROLL CODE BY PSYCHO void TrollHB() { int nFireDamage = GetLocalInt(OBJECT_SELF, "nFireDamage"); // total fire damage int nAcidDamage = GetLocalInt(OBJECT_SELF, "nAcidDamage"); // total acid damage int nPermanentDamage = nFireDamage + nAcidDamage; // total fire and acid damage int nOriginalHPs = GetMaxHitPoints(OBJECT_SELF); // the troll's original full HPs int nCurrentHPs = GetCurrentHitPoints(OBJECT_SELF); // the troll's current HPs // The maximum number of HPs that the Troll can possibly regenerate due to permanent fire or acid damage int nMaxHPsPossible = nOriginalHPs - nPermanentDamage; effect eHeal = EffectHeal(5); // regeneration effect (5 HPs every round) // the Troll may only regenerate if its current HPs is less than its // maximum possible HPs left after fire and acid damage if (nCurrentHPs <= nMaxHPsPossible) ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, OBJECT_SELF, 0.0f); } void TrollAttacked() { object oLastAttacker = GetLastAttacker(); // the last individual that attacked the troll int nAttackerXP = GetXP(oLastAttacker); // get the last attacker's XP int nCurrentHPs = GetCurrentHitPoints(OBJECT_SELF); // the troll's current HPs SetLocalInt(oLastAttacker, "nAttackerXP", nAttackerXP); // keep track of the last attackers XP } void TrollDamaged() { object oLastAttacker = GetLastDamager(); object oLastSpellCaster = GetLocalObject(OBJECT_SELF, "oLastSpellCaster"); // the Troll's cummulative Fire damage int nPrevFireDamage = GetLocalInt(OBJECT_SELF, "nFireDamage"); // the Troll's cummulative Acid damage int nPrevAcidDamage = GetLocalInt(OBJECT_SELF, "nAcidDamage"); // the Troll's current Fire damage newly received int nFireDamage = GetDamageDealtByType(DAMAGE_TYPE_FIRE); // the Troll's current Acid damage newly received int nAcidDamage = GetDamageDealtByType(DAMAGE_TYPE_ACID); if (nFireDamage < 0) nFireDamage = 0; // make sure Fire damage is not less than 0 if (nAcidDamage < 0) nAcidDamage = 0; // make sure Acid damage is not less than 0 if (nFireDamage > 0) // if the Troll suffered Fire damage { // keep track of cummulative Fire damage SetLocalInt(OBJECT_SELF, "nFireDamage", nPrevFireDamage + nFireDamage); } else if (nAcidDamage > 0) // if the Troll suffered Acid damage { // keep track of cummulative Acid damage SetLocalInt(OBJECT_SELF, "nAcidDamage", nPrevAcidDamage + nAcidDamage); } } void TrollSpellCastAt() { object oLastSpellCaster = GetLastSpellCaster(); int bSpellIsHarmful = GetLastSpellHarmful(); int nAttackerXP = GetXP(oLastSpellCaster); // the current XP of the attacker/spellcaster if (bSpellIsHarmful == TRUE) // if the spell cast at the Troll was harmful { SetLocalObject(OBJECT_SELF, "oLastSpellCaster", oLastSpellCaster); // retain the current XP of the attacker/spellcaster SetLocalInt(oLastSpellCaster, "nAttackerXP", nAttackerXP); } } void BurnTheTroll(location lDeadTrollLoc) { //Create the Burning Troll and Remove With Timer object oFlame = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_flamelarge", lDeadTrollLoc, TRUE); AssignCommand(GetArea(oFlame), DelayCommand(17.0, DestroyObject(oFlame))); } void BurnTrollCorpse(object oLight, object oShield, location lDeadTrollLoc) { // Weild the light source if required if(GetIsObjectValid(oLight)) { ActionEquipItem(oLight, INVENTORY_SLOT_LEFTHAND); ActionWait(0.5); } ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0); ActionDoCommand(BurnTheTroll(lDeadTrollLoc)); if(GetIsObjectValid(oLight)) { if(GetIsObjectValid(oShield)) ActionEquipItem(oShield, INVENTORY_SLOT_LEFTHAND); else ActionUnequipItem(oLight); } // Stop other actions for a while ActionDoCommand(SetCommandable(TRUE)); SetCommandable(FALSE); } int TrollDeath() { object oLastAttacker = GetLastKiller(); object oAttackingGroupMember; location lDeadTrollLoc = GetLocation(OBJECT_SELF); // the Troll's cummulative Fire damage int nPrevFireDamage = GetLocalInt(OBJECT_SELF, "nFireDamage"); // the Troll's cummulative Acid damage int nPrevAcidDamage = GetLocalInt(OBJECT_SELF, "nAcidDamage"); // the Troll's current total cummulative Fire damage int nFireDamage = GetDamageDealtByType(DAMAGE_TYPE_FIRE); if (nFireDamage < 0) nFireDamage = nPrevFireDamage; else nFireDamage = nFireDamage + nPrevFireDamage; // the Troll's current total cummulative Acid damage int nAcidDamage = GetDamageDealtByType(DAMAGE_TYPE_ACID); if (nAcidDamage < 0) nAcidDamage = nPrevAcidDamage; else nAcidDamage = nAcidDamage + nPrevAcidDamage; // the Troll's current total cummulative Fire and Acid damage int nTotalFireAcidDamage = nFireDamage + nAcidDamage; int nOriginalHPs = GetMaxHitPoints(); effect eRes = EffectResurrection(); // if the last attacker is the DM make sure that the DM can kill the // Troll without a fuss if (GetIsDM(oLastAttacker) == TRUE) { SetIsDestroyable(TRUE, FALSE, FALSE); DestroyObject(OBJECT_SELF, 0.0f); return TRUE; } // else check if the Troll's total cummulative Fire and Acid damage exceed // its original full HPs else if (nTotalFireAcidDamage >= nOriginalHPs) { // set the Troll ablaze and kill it for good by burning its corpse object oFlame = CreateObject(OBJECT_TYPE_PLACEABLE, "plc_flamelarge", lDeadTrollLoc, TRUE); DestroyObject(oFlame, 7.0f); DeleteLocalInt(oLastAttacker, "nAttackerXP"); //Dead Creature Processor (Includes NESS stuff) ExecuteScript("oai_proc_dead",OBJECT_SELF); return TRUE; } // check if the Troll's Fire and Acid damage sustained is less than the // its original full HPs else if (nTotalFireAcidDamage < nOriginalHPs) { // if the last attacker that damaged the troll is carrying a torch // and is within 5 feet of the troll // dk: 28-Dec-2005 ALl light sources now use oai_modprops_inc // Weild a torch if we are not yet weilding a light source object oLight = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oLastAttacker); object oShield = oLight; // In case we want to reweild it later int bNeedToWeild = FALSE; if(!GetModPropertyForItem(oLight, PROP_LIGHT, PROPV_LIGHT)) { oLight = GetModItemWithProperty(oLastAttacker, PROP_LIGHT, PROPV_TORCH); // If not weilding yet, then we need to weild it if we are going to burn the troll bNeedToWeild = GetIsObjectValid(oLight); } if (GetIsObjectValid(oLight) && (GetDistanceBetweenLocations(GetLocation(oLastAttacker), GetLocation(OBJECT_SELF)) <= 5.0 )) { // Weild the light source if needed if (!bNeedToWeild) { oLight = OBJECT_INVALID; oShield = OBJECT_INVALID; } // set the Troll ablaze, kill it for good by burning its corpse AssignCommand(oLastAttacker, ClearAllActions(TRUE)); AssignCommand(oLastAttacker, ActionDoCommand(BurnTrollCorpse(oLight, oShield, lDeadTrollLoc))); DeleteLocalInt(oLastAttacker, "nAttackerXP"); //Dead Creature Processor (Includes NESS stuff) ExecuteScript("oai_proc_dead",OBJECT_SELF); return TRUE; } else // otherwise the Troll comes back to life { SetIsDestroyable(FALSE, TRUE, TRUE); DelayCommand(6.0f, ApplyEffectToObject(DURATION_TYPE_INSTANT, eRes, OBJECT_SELF, 0.0f)); DelayCommand(6.5f, (SetIsDestroyable(TRUE, FALSE, FALSE))); // Remove from PC(s) XP gained by "killing" troll without acid or fire if (GetIsPC(oLastAttacker)) { oAttackingGroupMember = GetFirstFactionMember(oLastAttacker, TRUE); while (oAttackingGroupMember != OBJECT_INVALID) { DelayCommand(6.0f, SendMessageToPC(oAttackingGroupMember, "The Troll is not dead yet!")); oAttackingGroupMember = GetNextFactionMember(oLastAttacker, TRUE); } } // retain all previous cummulative permanent Fire and Acid damage DelayCommand(7.0f, SetLocalInt(OBJECT_SELF, "nFireDamage", nFireDamage)); DelayCommand(7.0f, SetLocalInt(OBJECT_SELF, "nAcidDamage", nAcidDamage)); // when the Troll "comes back to life" have it attack the last attacker DelayCommand(7.0f, AssignCommand(OBJECT_SELF, ActionAttack(oLastAttacker))); return FALSE; } } return FALSE; } //:: TROLL CODE ORIGINALLY BY ULIAS //:: NEW TROLL CODE BY PSYCHO /******************************************************************************/ int BreakIllusion(object oTarget, int nAmDead = FALSE) { //Has Illusion int nHasIllusion = GetLocalInt(oTarget,"OAI_HAS_ILLUSION"); if(nHasIllusion == FALSE) return FALSE; //Illusionary DC Roll int nDC = GetLocalInt(oTarget, "OAI_ILLUSION_DC"); if(WillSave(OBJECT_SELF, nDC) != 1) return FALSE; object oPC; int nReal = GetLocalInt(oTarget, "OAI_REAL_SELF"); string sName = GetName(oTarget); ClearAllActions(TRUE); effect eFX = EffectVisualEffect(VFX_DUR_ETHEREAL_VISAGE); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eFX, OBJECT_SELF); //Creature is Dead if(nAmDead) { SetCreatureAppearanceType(oTarget,nReal); oPC = GetFirstFactionMember(OBJECT_SELF, TRUE); while(GetIsObjectValid(oPC)) { if(GetArea(oPC) == oArea) FloatingTextStringOnCreature("The illusionary " + sName + " fades away, its creator is dead upon the ground.", oPC, FALSE); oPC = GetNextFactionMember(OBJECT_SELF, TRUE); } return TRUE; } //Creature is Still Alive else { if(d2()==1) PlayVoiceChat(VOICE_CHAT_BADIDEA, oTarget); SetCreatureAppearanceType(oTarget,nReal); oPC = GetFirstFactionMember(OBJECT_SELF, TRUE); while(GetIsObjectValid(oPC)) { if(GetArea(oPC) == oArea) { if(oPC == OBJECT_SELF) { FloatingTextStringOnCreature("You realized " + sName + " was merely an illusion, causing it to melt away.", oPC, FALSE); } else { FloatingTextStringOnCreature(GetName(OBJECT_SELF) + " realized " + sName + " is merely an illusion, causing it to melt away.", oPC, FALSE); } } oPC = GetNextFactionMember(OBJECT_SELF, TRUE); } return TRUE; } return FALSE; } void StatusCaster(object oTarget, int nState = 1) { object oMe=OBJECT_SELF; if(nState > 2) nState = 1; int bOverrideStates=FALSE; int nN; object oItem; //Invisible Target if(GetObjectSeen(oTarget)==FALSE && GetDistanceBetween(oTarget,oMe) < 20.0) { nN=caiProfessionalAntiStealth(); if (nN!=0) { bOverrideStates=TRUE; AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } } if(!bOverrideStates) { //Close Quarters AI if(GetDistanceBetween(oMe,oTarget) < 3.5) { nN = caiProfessionalCloseQuarters(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState = 2; //Defensive if(nState == 2) { nN=caiProfessionalDefensive(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 10; //Combat State } } else { //Defensive if(nState == 1) { nN=caiProfessionalDefensive(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 2; } //Offensive (AOE) if(nState == 2) { nN=caiProfessionalOffensive(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 3; } //Familiars and Animal Companions if(nState == 3) { //Check for familiars or animal companions to summon if(GetIsObjectValid(GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oMe,1))==FALSE&&GetHasFeat(FEAT_SUMMON_FAMILIAR)) { AssignCommand(oMe,ActionCastSpellAtObject(SPELLABILITY_SUMMON_FAMILIAR,oMe)); AssignCommand(oMe,ActionDoCommand(DecrementRemainingFeatUses(oMe,FEAT_SUMMON_FAMILIAR))); nState = 9; } else if(GetIsObjectValid(GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oMe,1))==FALSE&&GetHasFeat(FEAT_ANIMAL_COMPANION)) { AssignCommand(oMe,ActionCastSpellAtObject(SPELLABILITY_SUMMON_ANIMAL_COMPANION,oMe)); AssignCommand(oMe,ActionDoCommand(DecrementRemainingFeatUses(oMe,FEAT_ANIMAL_COMPANION))); nState = 9; } else { nState == 4; } } else nState == 4; //Offensive Counters if(nState == 4) { //Verify The Defense if(fnGetHasSpellDefense(oTarget)) { nN=caiProfessionalCounter(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 5; } else nState == 5; } //Offensive (Standard) if(nState == 5) { nN=caiGetAvailableCombatSpell(oMe,oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 6; } //Defensive if(nState == 6) { nN=caiGetAvailableDefensiveSpell(oMe,oMe); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 10; } //What to Do After Casting if(nState == 9) { if(WhatToDoAfterCasting(oMe)) return; else nState == 10; } //Fall Through General Attack if(nState == 10) AssignCommand(oMe,OAI_WrapperActionAttack(oTarget)); } } } void AttackCaster(object oTarget, int nState = 1) { object oMe=OBJECT_SELF; if(nState > 2) nState = 1; int bOverrideStates=FALSE; int nN; object oItem; //Invisible Target if(GetObjectSeen(oTarget)==FALSE && GetDistanceBetween(oTarget,oMe) < 20.0) { nN=caiProfessionalAntiStealth(); if (nN!=0) { bOverrideStates=TRUE; AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } } if(!bOverrideStates) { if(nState > 0)//Just Keeps the Format =) { //Defensive if(nState == 1) { nN=caiGetAvailableDefensiveSpell(oMe,oMe); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 2; } //Offensive (Standard) if(nState == 2) { nN=caiGetAvailableCombatSpell(oMe,oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 3; } //Offensive Counters if(nState == 4) { //Verify The Defense if(fnGetHasSpellDefense(oTarget)) { nN=caiProfessionalCounter(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 10; } else nState == 10; } //What to Do After Casting if(nState == 9) { if(WhatToDoAfterCasting(oMe)) return; else nState == 10; } //Fall Through General Attack if(nState == 10) AssignCommand(oMe,OAI_WrapperActionAttack(oTarget)); } } } void AOECaster(object oTarget, int nState = 1) { object oMe=OBJECT_SELF; if(nState > 2) nState = 1; int bOverrideStates=FALSE; int nN; object oItem; //Invisible Target if(GetObjectSeen(oTarget)==FALSE && GetDistanceBetween(oTarget,oMe) < 20.0) { nN=caiProfessionalAntiStealth(); if(nN!=0) { bOverrideStates=TRUE; AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } } if(!bOverrideStates) { if(nState > 0)//Just Keeps the Format =) { //Defensive if(nState == 1) { nN=caiGetAvailableDefensiveSpell(oMe,oMe); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 2; } //Offensive (AOE) if(nState == 2) { nN=caiProfessionalOffensive(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 3; } //Offensive (Standard) if(nState == 3) { nN=caiGetAvailableCombatSpell(oMe,oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 4; } //Offensive Counters if(nState == 4) { //Verify The Defense if(fnGetHasSpellDefense(oTarget)) { nN=caiProfessionalCounter(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 10; } else nState == 10; } else nState == 10; //What to Do After Casting if(nState == 9) { if(WhatToDoAfterCasting(oMe)) return; else nState == 10; } //Fall Through General Attack if(nState == 10) AssignCommand(oMe,OAI_WrapperActionAttack(oTarget)); } } } void BufferCaster(object oTarget, int nState = 1) { object oMe=OBJECT_SELF; if(nState > 2) nState = 1; int bOverrideStates=FALSE; int nN; object oItem; //Invisible Target if(GetObjectSeen(oTarget)==FALSE && GetDistanceBetween(oTarget,oMe) < 20.0) { nN=caiProfessionalAntiStealth(); if (nN!=0) { bOverrideStates=TRUE; AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } } if(!bOverrideStates) { //Close Quarters AI if(GetDistanceBetween(oMe,oTarget) < 3.5) { nN = caiProfessionalCloseQuarters(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState = 2; //Defensive if(nState == 2) { nN=caiProfessionalDefensive(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 10; //Combat State } } else { object oBest = caiGetBestObjectToHeal(oMe); //Heal Someone if(nState == 1) { int nStatus = GetCurrentHitPoints(oBest) * 2; int nBase = GetMaxHitPoints(oBest); if(nStatus < nBase) { if(GetIsPC(oBest)) nN=caiGetAvailableHealPC(oMe,oBest); else if(GetIsDead(oBest)==FALSE) nN=caiGetAvailableHeal(oMe,nN); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oBest)); nState = 9; } else nState == 2; } else nState == 2; } //Heal Myself if(nState == 2) { int nStatus = GetCurrentHitPoints(oMe) * 2; int nBase = GetMaxHitPoints(oMe); if(nStatus < nBase) { nN=caiGetAvailableHeal(oMe,nN,TRUE); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 3; } else nState == 3; } //Defensive if(nState == 3) { nN=caiGetAvailableDefensiveSpell(oMe,oBest); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oBest)); nState = 9; } else nState == 4; } //Buffing if(nState == 4) { nN=caiGetAvailableBuff(oMe,oBest); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oBest)); nState = 9; } else nState == 5; } //Defensive if(nState == 5) { nN=caiGetAvailableDefensiveSpell(oMe,oMe); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 6; } //Buffing if(nState == 6) { nN=caiGetAvailableBuff(oMe,oMe); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oMe)); nState = 9; } else nState == 7; } //Offensive Counters if(nState == 7) { //Verify The Defense if(fnGetHasSpellDefense(oTarget)) { nN=caiProfessionalCounter(oTarget); if(nN!=0) { AssignCommand(oMe,ActionCastSpellAtObject(nN,oTarget)); nState = 9; } else nState == 10; } else nState == 10; } else nState == 10; //What to Do After Casting if(nState == 9) { if(WhatToDoAfterCasting(oMe)) return; else nState == 10; } //Fall Through General Attack if(nState == 10) AssignCommand(oMe,OAI_WrapperActionAttack(oTarget)); } } } int GetIsTargetInMeleeRange(object oTarget,object oCreature=OBJECT_SELF) { if(GetDistanceBetween(oTarget,oCreature) <= 3.3) return TRUE; return FALSE; } void OAI_Crits(object oDamager,object oCreature=OBJECT_SELF) { //Critical System Turned OFF if (GetLocalInt(GetModule(),"OAICRIT") == 0) return; int nRoll = uroll(); if (nRoll < 91) return; // 10% max chance for any critical // These two numbers need to be tweaked to suite your tastes /* * NOTE: If we limit chance to 110 then 90-95 will be glancing critical for highly * skilled characters and 96+ will almost alway be a kill giving us 5% chance * of each. Has a nice feel to it. Remember these criticals are in addition to * the standard critical hits so we don't want them occuring all the time. Which * is why 201 is a good heavy threshold. Its still in reach of a novice and never * guaranteed (over a glancing critical that is, keep reading). * * Also: The lower critical for kill shots is okay as player level is not counted, * only weapon base and some feats are counted allowing the chance add for a * kill shot to max out at around 90-100 with a min of 15 which again gives a * max kill chance of about 5%. These numbers have worked well so far. */ int nCritThreshold = 171; // # needed to score a critical hit int nCritKillThreshold = 201; // # needed to score a killing critical hit int nKC; //Weapon (Creature Weapons NOT Counted!! Just does not fit) object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oDamager); if(GetIsObjectValid(oWeapon) == FALSE) { //No Weapon....Check For Glove or Bracer oWeapon = GetItemInSlot(INVENTORY_SLOT_ARMS,oDamager); if(GetIsObjectValid(oWeapon) == FALSE) return; } //Valid Weapon....Need Body Location /* 1 - 2 => Head 3 => Neck 4 - 5 => Chest 6 - 7 => Waist 8 => Groin 9 - 11 => Right Arm 12 - 14 => Left Arm 15 - 17 => Right Leg 18 - 20 => Left Leg */ int nBodyPart = d20(1); // Color Variables string RED = ""; string GRAY = ""; //VFX Blood effect eSBlood = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); effect eMBlood = EffectVisualEffect(VFX_COM_CHUNK_RED_MEDIUM); //Vermin for Green Blood int nCRace = GetRacialType(oCreature); if(nCRace == RACIAL_TYPE_VERMIN) { eSBlood = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL); eMBlood = EffectVisualEffect(VFX_COM_CHUNK_GREEN_MEDIUM); } //Ranged int nRanged = IsRangedWeapon(oWeapon); if(nRanged == TRUE) { nKC = OAI_RangedCalcKillChance(oDamager, oCreature, oWeapon); if(nKC == 0) return; if (GetIsPC(oDamager)) SendMessageToPC(oDamager, "nRoll = " + IntToString(nRoll) + " nSkill = " + IntToString(nKC)); if(nRoll + nKC >= nCritThreshold) { //Message AssignCommand(oCreature,SpeakString(RED+"Kill shot!!")); //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); OAI_CritKills(oCreature, oDamager); return; } return; } int nWeapon = GetBaseItemType(oWeapon); int nType = (StringToInt(Get2DAString("baseitems","WeaponType",nWeapon))); //Calculate Critical Chance nKC = OAI_MeleeCalcCritChance(oDamager, oCreature, oWeapon); if(nKC == 0) return; // No chance allowed if (GetIsPC(oDamager)) SendMessageToPC(oDamager, "nRoll = " + IntToString(nRoll) + " nSkill = " + IntToString(nKC)); nRoll += nKC; // No critical threshold then finish here if(nRoll < nCritThreshold) return; //Heavy or Glancing int nHit = 1; if (nRoll >= nCritKillThreshold) nHit = 2; /******************************************************************************/ //:: HEAD if(nBodyPart >= 1 && nBodyPart <= 2) { //Piercing if(nType == 1 || nType == 4) { //Helmets if(GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_HEAD, oCreature)) == BASE_ITEM_HELMET) { if(nHit == 2) DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD, oCreature)); nHit = 1; } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+PHEAD_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+PHEAD_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+PHEAD_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eMBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+HEAD_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+HEAD_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oCreature, HoursToSeconds(4)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } //Budgeoning if(nType == 2) { //Helmets if(GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_HEAD, oCreature)) == BASE_ITEM_HELMET) { if(nHit == 2) DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD, oCreature)); nHit = 1; } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+BHEAD_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+BHEAD_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+BHEAD_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+HEAD_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+HEAD_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oCreature, HoursToSeconds(4)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } //Slashing if(nType == 3 || nType == 4) { //Helmets if(GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_HEAD, oCreature)) == BASE_ITEM_HELMET) { if(nHit == 2) DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD, oCreature)); nHit = 1; } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+SHEAD_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+SHEAD_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+SHEAD_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eMBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+HEAD_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+HEAD_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oCreature, HoursToSeconds(4)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } } /******************************************************************************/ //:: NECK if(nBodyPart == 3) { //Piercing if(nType == 1 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+PNECK_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+PNECK_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+PNECK_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eMBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+NECK_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+NECK_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, 3.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } //Budgeoning if(nType == 2) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+BNECK_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+BNECK_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+BNECK_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+NECK_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+NECK_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, 3.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } //Slashing if(nType == 3 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+SNECK_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+SNECK_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+SNECK_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eMBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+NECK_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+NECK_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, 3.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } } /******************************************************************************/ //:: CHEST if(nBodyPart >= 4 && nBodyPart <= 5) { //Piercing if(nType == 1 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+PCHEST_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+PCHEST_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+PCHEST_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+CHEST_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+CHEST_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, 3.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } //Budgeoning if(nType == 2) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+BCHEST_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+BCHEST_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+BCHEST_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+CHEST_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+CHEST_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, 3.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } //Slashing if(nType == 3 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+SCHEST_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+SCHEST_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+SCHEST_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+CHEST_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+CHEST_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, 3.0); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } } /******************************************************************************/ //:: WAIST if(nBodyPart >= 6 && nBodyPart <= 7) { //Piercing if(nType == 1 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+PWAIST_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+PWAIST_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+PWAIST_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eMBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+WAIST_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+WAIST_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } //Budgeoning if(nType == 2) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+BWAIST_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+BWAIST_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+BWAIST_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+WAIST_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+WAIST_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } //Slashing if(nType == 3 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+SWAIST_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+SWAIST_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+SWAIST_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eMBlood, oCreature); //Apply Death Effects OAI_CritKills(oCreature, oDamager); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+WAIST_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+WAIST_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } } /******************************************************************************/ //:: RIGHT ARM if(nBodyPart >= 9 && nBodyPart <= 11) { //Piercing if(nType == 1 || nType == 4) { //Weapon object oCWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); if(GetIsObjectValid(oCWeapon) == TRUE) { if(nHit == 2) { //Drops Weapon CreateObject(OBJECT_TYPE_ITEM, GetResRef(oCWeapon), GetLocation(oCreature)); DestroyObject(oCWeapon, 0.5); } } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+PARM_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+PARM_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+PARM_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_PIERCING), oCreature)); } return; } //Budgeoning if(nType == 2) { //Weapon object oCWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); if(GetIsObjectValid(oCWeapon) == TRUE) { if(nHit == 2) { //Drops Weapon CreateObject(OBJECT_TYPE_ITEM, GetResRef(oCWeapon), GetLocation(oCreature)); DestroyObject(oCWeapon, 0.5); } } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+BARM_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+BARM_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+BARM_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_BLUDGEONING), oCreature)); } return; } //Slashing if(nType == 3 || nType == 4) { //Weapon object oCWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature); if(GetIsObjectValid(oCWeapon) == TRUE) { if(nHit == 2) { //Drops Weapon CreateObject(OBJECT_TYPE_ITEM, GetResRef(oCWeapon), GetLocation(oCreature)); DestroyObject(oCWeapon, 0.5); } } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+SARM_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+SARM_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+SARM_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eMBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_SLASHING), oCreature)); } return; } } /******************************************************************************/ //:: LEFT ARM if(nBodyPart >= 12 && nBodyPart <= 14) { //Piercing if(nType == 1 || nType == 4) { //Shield if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature)) == TRUE) { if(nHit == 2) { object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature); int nShield = GetBaseItemType(oShield); if(nShield == BASE_ITEM_LARGESHIELD || nShield == BASE_ITEM_SMALLSHIELD || nShield == BASE_ITEM_TOWERSHIELD) { //Destroy Shield DestroyObject(oShield, 0.5); nHit = 1; } } } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+PARM_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+PARM_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+PARM_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } //Budgeoning if(nType == 2) { //Shield if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature)) == TRUE) { if(nHit == 2) { object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature); int nShield = GetBaseItemType(oShield); if(nShield == BASE_ITEM_LARGESHIELD || nShield == BASE_ITEM_SMALLSHIELD || nShield == BASE_ITEM_TOWERSHIELD) { //Destroy Shield DestroyObject(oShield, 0.5); nHit = 1; } } } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+BARM_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+BARM_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+BARM_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } //Slashing if(nType == 3 || nType == 4) { //Shield if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature)) == TRUE) { if(nHit == 2) { object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature); int nShield = GetBaseItemType(oShield); if(nShield == BASE_ITEM_LARGESHIELD || nShield == BASE_ITEM_SMALLSHIELD || nShield == BASE_ITEM_TOWERSHIELD) { //Destroy Shield DestroyObject(oShield, 0.5); nHit = 1; } } } //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+SARM_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+SARM_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+SARM_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+ARM_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectStunned(), oCreature, RoundsToSeconds(1)); } return; } } /******************************************************************************/ //:: LEGS if(nBodyPart >= 15 && nBodyPart <= 20) { //Piercing if(nType == 1 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+PLEG_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+PLEG_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+PLEG_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+LEG_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+LEG_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_PIERCING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } //Budgeoning if(nType == 2) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+BLEG_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+BLEG_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+BLEG_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+LEG_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+LEG_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_BLUDGEONING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } //Slashing if(nType == 3 || nType == 4) { //Heavy Hit if(nHit == 2) { //Apply Voice Chat PlayVoiceChat(VOICE_CHAT_DEATH,oCreature); AssignCommand(oCreature,SpeakString(RED+"Heavy Critical: ")); int nD3 = d3(1); switch(nD3) { case 1: AssignCommand(oCreature,SpeakString(GRAY+SLEG_HEAVY1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+SLEG_HEAVY2)); break; case 3: AssignCommand(oCreature,SpeakString(GRAY+SLEG_HEAVY3)); break; } //Apply Visual ApplyEffectToObject(DURATION_TYPE_INSTANT, eSBlood, oCreature); //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(20, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } else { AssignCommand(oCreature,SpeakString(RED+"Glancing Critical: ")); int nD2 = d2(1); switch(nD2) { case 1: AssignCommand(oCreature,SpeakString(GRAY+LEG_GLANCE1)); break; case 2: AssignCommand(oCreature,SpeakString(GRAY+LEG_GLANCE2)); break; } //Apply Additional Damage AssignCommand(oDamager, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(10, DAMAGE_TYPE_SLASHING), oCreature)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oCreature, RoundsToSeconds(1)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oCreature, RoundsToSeconds(2)); } return; } } } void OAI_CritKills(object oCreature, object oKiller) { AssignCommand(oCreature, ClearAllActions(TRUE)); int nD4 = d4(1); int nCHP = GetCurrentHitPoints(oCreature); //Fall Over Dead if(nD4 == 1) { //PlayVoiceChat(VOICE_CHAT_DEATH, oCreature); DelayCommand(0.5, AssignCommand(oKiller, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nCHP + 1), oCreature))); } //Spasm Death if(nD4 == 2) { ActionPlayAnimation(ANIMATION_LOOPING_SPASM, 1.0, 3.0); //PlayVoiceChat(VOICE_CHAT_DEATH, oCreature); DelayCommand(0.5, AssignCommand(oKiller, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nCHP + 1), oCreature))); } //Kneel Death if(nD4 == 3) { ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectKnockdown(), oCreature); //PlayVoiceChat(VOICE_CHAT_DEATH, oCreature); DelayCommand(0.5, AssignCommand(oKiller, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nCHP + 1), oCreature))); } //Fall Face Down Death if(nD4 == 4) { ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0, 3.0); //PlayVoiceChat(VOICE_CHAT_DEATH, oCreature); DelayCommand(0.5, AssignCommand(oKiller, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nCHP + 1), oCreature))); } } // Max should be 110, min can be negative, openended roll + this > limit = critical hit int OAI_MeleeCalcCritChance(object oDamager, object oCreature, object oWeapon) { int nWeapon = GetBaseItemType(oWeapon); int nChance = 0; int nDSize = GetCreatureSize(oDamager); int nCSize = GetCreatureSize(oCreature); int nCRace = GetRacialType(oCreature); //IMMUNTIES/RESISTANCES TO CRITS if(nCRace == RACIAL_TYPE_DRAGON) return 0; if(nCRace == RACIAL_TYPE_UNDEAD) return 0; if(nCRace == RACIAL_TYPE_OUTSIDER) return 0; if(nCRace == RACIAL_TYPE_CONSTRUCT) return 0; if(nCRace == RACIAL_TYPE_ELEMENTAL) return 0; if(GetIsImmune(oCreature,IMMUNITY_TYPE_CRITICAL_HIT) == TRUE) return 0; // First add is Lvl (max at 10) multiplied by points per class (1..6) int nPos, nLvl, nClass; for (nPos = 1; nPos <= 3; nPos++) { nLvl = GetLevelByPosition(nPos, oDamager); if (nLvl > 0) { nClass = GetClassByPosition(nPos, oDamager); int nPoints = 0; switch (nClass) { case CLASS_TYPE_WEAPON_MASTER: case CLASS_TYPE_DRAGON: nPoints = 7; break; case CLASS_TYPE_BARBARIAN: case CLASS_TYPE_DWARVEN_DEFENDER: case CLASS_TYPE_FIGHTER: case CLASS_TYPE_MONK: case CLASS_TYPE_CONSTRUCT: nPoints = 6; break; case CLASS_TYPE_BLACKGUARD: case CLASS_TYPE_DIVINE_CHAMPION: case CLASS_TYPE_PALADIN: case CLASS_TYPE_RANGER: case CLASS_TYPE_ELEMENTAL: case CLASS_TYPE_GIANT: nPoints = 5; break; case CLASS_TYPE_ASSASSIN: case CLASS_TYPE_ROGUE: case CLASS_TYPE_MAGICAL_BEAST: case CLASS_TYPE_OUTSIDER: case CLASS_TYPE_SHAPECHANGER: nPoints = 4; break; case CLASS_TYPE_SHIFTER: case CLASS_TYPE_BARD: nPoints = 3; break; case CLASS_TYPE_ABERRATION: case CLASS_TYPE_MONSTROUS: case CLASS_TYPE_UNDEAD: case CLASS_TYPE_VERMIN: nPoints = 2; break; default: nPoints = 1; } // Only count 10 levels max (don't learn anything new after level 10) if (nLvl > 10) nLvl = 10; nChance += nLvl * nPoints; } } // Restrict total bonus from levels to 80 to allow for specialisations to take us to 110 // Size bonuses are an extra benefit if (nChance > 80) nChance = 80; //WEAPON FOCUS/SPECIALIZATION // dk: 11-Dec-2005 Replaced code and ammended with following chunk int nFeat = 0, nSpec = 0, nCrit = 0; switch (nWeapon) { case BASE_ITEM_BASTARDSWORD: nFeat = FEAT_WEAPON_FOCUS_BASTARD_SWORD; nSpec = FEAT_WEAPON_SPECIALIZATION_BASTARD_SWORD; nCrit = FEAT_IMPROVED_CRITICAL_BASTARD_SWORD; break; case BASE_ITEM_BATTLEAXE: nFeat = FEAT_WEAPON_FOCUS_BATTLE_AXE; nSpec = FEAT_WEAPON_SPECIALIZATION_BATTLE_AXE; nCrit = FEAT_IMPROVED_CRITICAL_BATTLE_AXE; break; case BASE_ITEM_CLUB: nFeat = FEAT_WEAPON_FOCUS_CLUB; nSpec = FEAT_WEAPON_SPECIALIZATION_CLUB; nCrit = FEAT_IMPROVED_CRITICAL_CLUB; break; case BASE_ITEM_CREATUREITEM: nFeat = FEAT_WEAPON_FOCUS_CREATURE; nSpec = FEAT_WEAPON_SPECIALIZATION_CREATURE; nCrit = FEAT_IMPROVED_CRITICAL_CREATURE; break; case BASE_ITEM_DAGGER: nFeat = FEAT_WEAPON_FOCUS_DAGGER; nSpec = FEAT_WEAPON_SPECIALIZATION_DAGGER; nCrit = FEAT_IMPROVED_CRITICAL_DAGGER; break; case BASE_ITEM_DIREMACE: nFeat = FEAT_WEAPON_FOCUS_DIRE_MACE; nSpec = FEAT_WEAPON_SPECIALIZATION_DIRE_MACE; nCrit = FEAT_IMPROVED_CRITICAL_DIRE_MACE; break; case BASE_ITEM_DOUBLEAXE: nFeat = FEAT_WEAPON_FOCUS_DOUBLE_AXE; nSpec = FEAT_WEAPON_SPECIALIZATION_DOUBLE_AXE; nCrit = FEAT_IMPROVED_CRITICAL_DOUBLE_AXE; break; case BASE_ITEM_DWARVENWARAXE: nFeat = FEAT_WEAPON_FOCUS_DWAXE; nSpec = FEAT_WEAPON_SPECIALIZATION_DWAXE; nCrit = FEAT_IMPROVED_CRITICAL_DWAXE; break; case BASE_ITEM_GREATAXE: nFeat = FEAT_WEAPON_FOCUS_GREAT_AXE; nSpec = FEAT_WEAPON_SPECIALIZATION_GREAT_AXE; nCrit = FEAT_IMPROVED_CRITICAL_GREAT_AXE; break; case BASE_ITEM_GREATSWORD: nFeat = FEAT_WEAPON_FOCUS_GREAT_SWORD; nSpec = FEAT_WEAPON_SPECIALIZATION_GREAT_SWORD; nCrit = FEAT_IMPROVED_CRITICAL_GREAT_SWORD; break; case BASE_ITEM_HALBERD: nFeat = FEAT_WEAPON_FOCUS_HALBERD; nSpec = FEAT_WEAPON_SPECIALIZATION_HALBERD; nCrit = FEAT_IMPROVED_CRITICAL_HALBERD; break; case BASE_ITEM_HANDAXE: nFeat = FEAT_WEAPON_FOCUS_HAND_AXE; nSpec = FEAT_WEAPON_SPECIALIZATION_HAND_AXE; nCrit = FEAT_IMPROVED_CRITICAL_HAND_AXE; break; case BASE_ITEM_HEAVYFLAIL: nFeat = FEAT_WEAPON_FOCUS_HEAVY_FLAIL; nSpec = FEAT_WEAPON_SPECIALIZATION_HEAVY_FLAIL; nCrit = FEAT_IMPROVED_CRITICAL_HEAVY_FLAIL; break; case BASE_ITEM_KAMA: nFeat = FEAT_WEAPON_FOCUS_KAMA; nSpec = FEAT_WEAPON_SPECIALIZATION_KAMA; nCrit = FEAT_IMPROVED_CRITICAL_KAMA; break; case BASE_ITEM_KATANA: nFeat = FEAT_WEAPON_FOCUS_KATANA; nSpec = FEAT_WEAPON_SPECIALIZATION_KATANA; nCrit = FEAT_IMPROVED_CRITICAL_KATANA; break; case BASE_ITEM_KUKRI: nFeat = FEAT_WEAPON_FOCUS_KUKRI; nSpec = FEAT_WEAPON_SPECIALIZATION_KUKRI; nCrit = FEAT_IMPROVED_CRITICAL_KUKRI; break; case BASE_ITEM_LIGHTFLAIL: nFeat = FEAT_WEAPON_FOCUS_LIGHT_FLAIL; nSpec = FEAT_WEAPON_SPECIALIZATION_LIGHT_FLAIL; nCrit = FEAT_IMPROVED_CRITICAL_LIGHT_FLAIL; break; case BASE_ITEM_LIGHTHAMMER: nFeat = FEAT_WEAPON_FOCUS_LIGHT_HAMMER; nSpec = FEAT_WEAPON_SPECIALIZATION_LIGHT_HAMMER; nCrit = FEAT_IMPROVED_CRITICAL_LIGHT_HAMMER; break; case BASE_ITEM_LIGHTMACE: nFeat = FEAT_WEAPON_FOCUS_LIGHT_MACE; nSpec = FEAT_WEAPON_SPECIALIZATION_LIGHT_MACE; nCrit = FEAT_IMPROVED_CRITICAL_LIGHT_MACE; break; case BASE_ITEM_LONGSWORD: nFeat = FEAT_WEAPON_FOCUS_LONG_SWORD; nSpec = FEAT_WEAPON_SPECIALIZATION_LONG_SWORD; nCrit = FEAT_IMPROVED_CRITICAL_LONG_SWORD; break; case BASE_ITEM_MORNINGSTAR: nFeat = FEAT_WEAPON_FOCUS_MORNING_STAR; nSpec = FEAT_WEAPON_SPECIALIZATION_MORNING_STAR; nCrit = FEAT_IMPROVED_CRITICAL_MORNING_STAR; break; case BASE_ITEM_RAPIER: nFeat = FEAT_WEAPON_FOCUS_RAPIER; nSpec = FEAT_WEAPON_SPECIALIZATION_RAPIER; nCrit = FEAT_IMPROVED_CRITICAL_RAPIER; break; case BASE_ITEM_SCIMITAR: nFeat = FEAT_WEAPON_FOCUS_SCIMITAR; nSpec = FEAT_WEAPON_SPECIALIZATION_SCIMITAR; nCrit = FEAT_IMPROVED_CRITICAL_SCIMITAR; break; case BASE_ITEM_SCYTHE: nFeat = FEAT_WEAPON_FOCUS_SCYTHE; nSpec = FEAT_WEAPON_SPECIALIZATION_SCYTHE; nCrit = FEAT_IMPROVED_CRITICAL_SCYTHE; break; case BASE_ITEM_SHORTSWORD: nFeat = FEAT_WEAPON_FOCUS_SHORT_SWORD; nSpec = FEAT_WEAPON_SPECIALIZATION_SHORT_SWORD; nCrit = FEAT_IMPROVED_CRITICAL_SHORT_SWORD; break; case BASE_ITEM_SICKLE: nFeat = FEAT_WEAPON_FOCUS_SICKLE; nSpec = FEAT_WEAPON_SPECIALIZATION_SICKLE; nCrit = FEAT_IMPROVED_CRITICAL_SICKLE; break; case BASE_ITEM_SHORTSPEAR: nFeat = FEAT_WEAPON_FOCUS_SPEAR; nSpec = FEAT_WEAPON_SPECIALIZATION_SPEAR; nCrit = FEAT_IMPROVED_CRITICAL_SPEAR; break; case BASE_ITEM_QUARTERSTAFF: nFeat = FEAT_WEAPON_FOCUS_STAFF; nSpec = FEAT_WEAPON_SPECIALIZATION_STAFF; nCrit = FEAT_IMPROVED_CRITICAL_STAFF; break; case BASE_ITEM_TWOBLADEDSWORD: nFeat = FEAT_WEAPON_FOCUS_TWO_BLADED_SWORD; nSpec = FEAT_WEAPON_SPECIALIZATION_TWO_BLADED_SWORD; nCrit = FEAT_IMPROVED_CRITICAL_TWO_BLADED_SWORD; break; case BASE_ITEM_GLOVES: nFeat = FEAT_WEAPON_FOCUS_UNARMED_STRIKE; nSpec = FEAT_WEAPON_SPECIALIZATION_UNARMED_STRIKE; nCrit = FEAT_IMPROVED_CRITICAL_UNARMED_STRIKE; break; case BASE_ITEM_WARHAMMER: nFeat = FEAT_WEAPON_FOCUS_WAR_HAMMER; nSpec = FEAT_WEAPON_SPECIALIZATION_WAR_HAMMER; nCrit = FEAT_IMPROVED_CRITICAL_WAR_HAMMER; break; case BASE_ITEM_WHIP: nFeat = FEAT_WEAPON_FOCUS_WHIP; nSpec = FEAT_WEAPON_SPECIALIZATION_WHIP; nCrit = FEAT_IMPROVED_CRITICAL_WHIP; } if (GetHasFeat(nFeat, oDamager)) nChance += 10; // Focus bonus if (GetHasFeat(nSpec, oDamager)) nChance += 15; // Weapon Spec bonus if (GetHasFeat(nCrit, oDamager)) nChance += 15; // Improved Critical bonus // Here Max Chance is 110 which means 5% chance of glancing and 5% of heavy criticals // The size bonuses below now vary from // 40 when tiny attacked huge // through to // 165 when huge hits tiny but will be reduced back to 110 anyway //DAMAGER SIZE ADJUSTMENTS if(nDSize == CREATURE_SIZE_HUGE) {nChance += 40;} if(nDSize == CREATURE_SIZE_LARGE) {nChance += 20;} if(nDSize == CREATURE_SIZE_MEDIUM){nChance += 0;} if(nDSize == CREATURE_SIZE_SMALL) {nChance += -15;} if(nDSize == CREATURE_SIZE_TINY) {nChance += -30;} //CREATURE SIZE ADJUSTMENTS if(nCSize == CREATURE_SIZE_HUGE) {nChance += -40;} if(nCSize == CREATURE_SIZE_LARGE) {nChance += -20;} if(nCSize == CREATURE_SIZE_MEDIUM){nChance += 0;} if(nCSize == CREATURE_SIZE_SMALL) {nChance += 15;} if(nCSize == CREATURE_SIZE_TINY) {nChance += 30;} // We limit max chance to 110 so that 90-95 won't get a heavy critical // if allowed to be more then 110 there will never be glancing criticals // and simple 10% heavy criticals (assuming the numbers are still 171 and 201) return (nChance > 110) ? 110 : nChance; } // dk: 11-Dec-2005 Totally reveiwed numbers in all below int OAI_RangedCalcKillChance(object oDamager, object oCreature, object oWeapon) { int nChance; int nWeapon = GetBaseItemType(oWeapon); int nAC = GetAC(oCreature); //IF IMMUNE TO CRITICALS, THEN IMMUNE TO THIS if(GetIsImmune(oCreature,IMMUNITY_TYPE_CRITICAL_HIT) == TRUE){return 0;} int PlayerRace = GetRacialType(oDamager); int EnemySize = GetCreatureSize(oCreature); int EnemyRace = GetRacialType(oCreature); //IMMUNTIES/RESISTANCES TO INSTANT KILLS if(EnemyRace == RACIAL_TYPE_DRAGON) {return 0;} //You can't blow away Dragons if(EnemyRace == RACIAL_TYPE_UNDEAD) {return 0;} //nor Undead (they're already dead) if(EnemyRace == RACIAL_TYPE_OUTSIDER) {return 0;} //nor Outsiders if(EnemyRace == RACIAL_TYPE_CONSTRUCT){return 0;} //nor Constructs if(EnemyRace == RACIAL_TYPE_ELEMENTAL){return 0;} //nor Elementals //BASE SETTINGS switch (nWeapon) { case BASE_ITEM_LONGBOW: nChance = 30; break; case BASE_ITEM_SHORTBOW: nChance = 25; break; case BASE_ITEM_LIGHTCROSSBOW: nChance = 25; break; case BASE_ITEM_HEAVYCROSSBOW: nChance = 35; break; case BASE_ITEM_SLING: nChance = 15; break; case BASE_ITEM_THROWINGAXE: nChance = 20; break; case BASE_ITEM_DART: nChance = 15; break; case BASE_ITEM_SHURIKEN: nChance = 20; break; } //SETTINGS DUE TO ARMOR if(nAC > 35) {nChance += -40;} else if(nAC > 25){nChance += -25;} else if(nAC > 20){nChance += -15;} else if(nAC > 15){nChance += -10;} else if(nAC > 10){nChance += 0;} else if(nAC > 0){nChance += 15;} else if(nAC == 0){nChance += 25;} //SETTINGS DUE TO WEAPON FOCUS/SPECIALIZATION //A modest %15 boost for focused weapon if(nWeapon == BASE_ITEM_LONGBOW && GetHasFeat(FEAT_WEAPON_FOCUS_LONGBOW, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_SHORTBOW && GetHasFeat(FEAT_WEAPON_FOCUS_SHORTBOW, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_LIGHTCROSSBOW && GetHasFeat(FEAT_WEAPON_FOCUS_LIGHT_CROSSBOW, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_HEAVYCROSSBOW && GetHasFeat(FEAT_WEAPON_FOCUS_HEAVY_CROSSBOW, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_SLING && GetHasFeat(FEAT_WEAPON_FOCUS_SLING, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_THROWINGAXE && GetHasFeat(FEAT_WEAPON_FOCUS_THROWING_AXE, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_DART && GetHasFeat(FEAT_WEAPON_FOCUS_DART, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_SHURIKEN && GetHasFeat(FEAT_WEAPON_FOCUS_SHURIKEN, oDamager) == TRUE){nChance += 15;} //An addition %15 for specialization if(nWeapon == BASE_ITEM_LONGBOW && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_LONGBOW, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_SHORTBOW && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_SHORTBOW, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_LIGHTCROSSBOW && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_LIGHT_CROSSBOW, oDamager) == TRUE){nChance+= 15;} if(nWeapon == BASE_ITEM_HEAVYCROSSBOW && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_HEAVY_CROSSBOW, oDamager) == TRUE){nChance+= 15;} if(nWeapon == BASE_ITEM_SLING && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_SLING, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_THROWINGAXE && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_THROWING_AXE, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_DART && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_DART, oDamager) == TRUE){nChance += 15;} if(nWeapon == BASE_ITEM_SHURIKEN && GetHasFeat(FEAT_WEAPON_SPECIALIZATION_SHURIKEN, oDamager) == TRUE){nChance += 15;} //An addition %20 for Improved Critical if(nWeapon == BASE_ITEM_LONGBOW && GetHasFeat(FEAT_IMPROVED_CRITICAL_LONGBOW, oDamager) == TRUE){nChance += 20;} if(nWeapon == BASE_ITEM_SHORTBOW && GetHasFeat(FEAT_IMPROVED_CRITICAL_SHORTBOW, oDamager) == TRUE){nChance += 20;} if(nWeapon == BASE_ITEM_LIGHTCROSSBOW && GetHasFeat(FEAT_IMPROVED_CRITICAL_LIGHT_CROSSBOW, oDamager) == TRUE){nChance+= 20;} if(nWeapon == BASE_ITEM_HEAVYCROSSBOW && GetHasFeat(FEAT_IMPROVED_CRITICAL_HEAVY_CROSSBOW, oDamager) == TRUE){nChance+= 20;} if(nWeapon == BASE_ITEM_SLING && GetHasFeat(FEAT_IMPROVED_CRITICAL_SLING, oDamager) == TRUE){nChance += 20;} if(nWeapon == BASE_ITEM_THROWINGAXE && GetHasFeat(FEAT_IMPROVED_CRITICAL_THROWING_AXE, oDamager) == TRUE){nChance += 20;} if(nWeapon == BASE_ITEM_DART && GetHasFeat(FEAT_IMPROVED_CRITICAL_DART, oDamager) == TRUE){nChance += 20;} if(nWeapon == BASE_ITEM_SHURIKEN && GetHasFeat(FEAT_IMPROVED_CRITICAL_SHURIKEN, oDamager) == TRUE){nChance += 20;} //SETTINGS DUE TO PLAYER RACE if(PlayerRace == RACIAL_TYPE_ELF && nWeapon == BASE_ITEM_LONGBOW){nChance += 20;} if(PlayerRace == RACIAL_TYPE_HALFELF && nWeapon == BASE_ITEM_LONGBOW){nChance += 10;} if(PlayerRace == RACIAL_TYPE_HALFLING && nWeapon == BASE_ITEM_SLING){nChance += 20;} //SETTINGS DUE TO ENEMY SIZE if(EnemySize == CREATURE_SIZE_HUGE) {nChance += 10;} if(EnemySize == CREATURE_SIZE_LARGE) {nChance += 5;} if(EnemySize == CREATURE_SIZE_MEDIUM){nChance += 0;} if(EnemySize == CREATURE_SIZE_SMALL) {nChance += -15;} if(EnemySize == CREATURE_SIZE_TINY) {nChance += -25;} //FORTITUDE/REFLEX SAVING THROW //if(FortitudeSave(oCreature,nChance/5 + 20)){return 0;} //if(ReflexSave(oCreature,nChance/5 + 20)){return 0;} // Here a zero is a real modifier, change to 1 to allow critical roll if (nChance == 0) nChance = 1; return nChance; } int TryToWhirl(object oCreature) { int nSTR = GetAbilityScore(oCreature,ABILITY_STRENGTH); int nINT = GetAbilityScore(oCreature,ABILITY_INTELLIGENCE); int nWhirl = nSTR + nINT; if(GetHasFeat(FEAT_WHIRLWIND_ATTACK) || GetHasFeat(FEAT_IMPROVED_WHIRLWIND)) { int nNumberofAttackers = WhirlwindGetNumberOfMeleeAttackers(WHIRL_DISTANCE); if(nNumberofAttackers) { if(Random(100) + 1 <= nWhirl) { ActionUseFeat(FEAT_WHIRLWIND_ATTACK, oCreature); return TRUE; } else return FALSE; } else return FALSE; } return FALSE; } //General Melee Combat void MeleeGeneral(object oTarget,object oCreature = OBJECT_SELF) { int nAC = GetAC(oTarget); int nAttack = GetHitDice(OBJECT_SELF); int nSTR = GetAbilityModifier(ABILITY_STRENGTH); int nDiff = (nAttack + nSTR) - nAC; //Try to Enhance Weapon int nWeapon = FALSE; if(TrySpell(SPELL_KEEN_EDGE, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_BLADE_THIRST, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_BLACKSTAFF, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_GREATER_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_FLAME_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; //Try Taunt int nTaunt = GetLocalInt(oCreature,"OAI_TAUNTTRY"); if(GetSkillRank(SKILL_TAUNT) > GetSkillRank(SKILL_CONCENTRATION) && nTaunt == 0 && d2() == 1) { SetLocalInt(oCreature,"OAI_TAUNTTRY",1); PlayVoiceChat(VOICE_CHAT_TAUNT); ActionUseSkill(SKILL_TAUNT, oTarget); DetermineCombatRound(oTarget); return; } if(GetHasFeat(FEAT_BARBARIAN_RAGE) && !GetHasSpellEffect(307) && GetLevelByClass(CLASS_TYPE_BARBARIAN) > 0) { ActionUseFeat(FEAT_BARBARIAN_RAGE, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_BARBARIAN_RAGE); DetermineCombatRound(oTarget); } if(GetHasFeat(FEAT_IMPROVED_POWER_ATTACK) && nDiff > 9) { ActionUseFeat(FEAT_IMPROVED_POWER_ATTACK, oTarget); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_POWER_ATTACK) && nDiff > 4) { ActionUseFeat(FEAT_POWER_ATTACK, oTarget); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_SHADOW_DAZE) && !GetHasFeatEffect(FEAT_SHADOW_DAZE, oTarget)) { ActionUseFeat(FEAT_SHADOW_DAZE, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SHADOW_DAZE); OAI_WrapperActionAttack(oTarget); return; } int nFeat = -1; int nRand = Random(4); if (nRand == 0) { int nMySize = GetCreatureSize(OBJECT_SELF); if(GetHasFeat(FEAT_IMPROVED_KNOCKDOWN)) { nFeat = FEAT_IMPROVED_KNOCKDOWN; nMySize++; } else if (GetHasFeat(FEAT_KNOCKDOWN)) { nFeat = FEAT_KNOCKDOWN; } if(GetIsImmune(oTarget, IMMUNITY_TYPE_KNOCKDOWN) || GetCreatureSize(oTarget) > nMySize+1) nFeat = -1; } if(nFeat != -1) { ActionUseFeat(nFeat, oTarget); OAI_WrapperActionAttack(oTarget); return; } nFeat = -1; nRand = Random(4); if(nRand == 0 && GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget))) { int nMySize = GetCreatureSize(OBJECT_SELF); if(GetHasFeat(FEAT_IMPROVED_DISARM) && nDiff > 3) { nFeat = FEAT_IMPROVED_DISARM; nMySize++; } else if (GetHasFeat(FEAT_DISARM) && nDiff > 5) { nFeat = FEAT_DISARM; } } if(nFeat != -1) { ActionUseFeat(nFeat, oTarget); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_INFLICT_CRITICAL_WOUNDS)) { ActionUseFeat(FEAT_INFLICT_CRITICAL_WOUNDS, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_INFLICT_CRITICAL_WOUNDS); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_INFLICT_SERIOUS_WOUNDS)) { ActionUseFeat(FEAT_INFLICT_SERIOUS_WOUNDS, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_INFLICT_SERIOUS_WOUNDS); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_CONTAGION)) { ActionUseFeat(FEAT_CONTAGION, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_CONTAGION); OAI_WrapperActionAttack(oTarget); return; } talent tUse = GetCreatureTalent(TALENT_CATEGORY_HARMFUL_MELEE,20); if(GetIsTalentValid(tUse) && VerifyCombatMeleeTalent(tUse, oTarget)) { bkTalentFilter(tUse, oTarget); return; } } //General Melee Combat void MeleeDexterity(object oTarget,object oCreature = OBJECT_SELF) { int nAC = GetAC(oTarget); int nAttack = GetHitDice(OBJECT_SELF); int nSTR = GetAbilityModifier(ABILITY_STRENGTH); int nDiff = (nAttack + nSTR) - nAC; //Try to Enhance Weapon int nWeapon = FALSE; if(TrySpell(SPELL_BLADE_THIRST, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_KEEN_EDGE, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(GetHasFeat(FEAT_SHADOW_DAZE) && !GetHasFeatEffect(FEAT_SHADOW_DAZE, oTarget)) { ActionUseFeat(FEAT_SHADOW_DAZE, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SHADOW_DAZE); } //Try to Flank and Parry location lLoc; location lLFlank = GetFlankingLeftLocation(oTarget); location lRFlank = GetFlankingRightLocation(oTarget); location lFLFlank = GetForwardFlankingLeftLocation(oTarget); location lFRFlank = GetForwardFlankingRightLocation(oTarget); if(d2() == 1) { switch(d4()) { case 1: lLoc = lLFlank; break; case 2: lLoc = lRFlank; break; case 3: lLoc = lFLFlank; break; case 4: lLoc = lFRFlank; break; } ClearAllActions(); ActionMoveToLocation(lLoc, TRUE); } if(SpecialTacticsDefensive(oTarget)) return; OAI_WrapperActionAttack(oTarget); } //Ranged Combat void RangedCombat(object oTarget,object oCreature = OBJECT_SELF) { int nArQty = GetLocalInt(oTarget,"ARROW"); int nBoQty = GetLocalInt(oTarget,"BOLT"); int nBuQty = GetLocalInt(oTarget,"BULLET"); //Switch to Melee if(GetDistanceToObject(oTarget) < 5.0 && !GetHasFeat(FEAT_POINT_BLANK_SHOT)) { DetermineCombatRound(oTarget); return; } //Force the Ranged Equip if(!GetIsWieldingRanged(OBJECT_SELF)) { ClearAllActions(); ActionEquipMostDamagingRanged(); } //Arcane Archer if(GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER) > 0) { if(GetHasFeat(FEAT_PRESTIGE_ARROW_OF_DEATH)) { ActionUseFeat(FEAT_PRESTIGE_ARROW_OF_DEATH, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_PRESTIGE_ARROW_OF_DEATH); ActionAttack(oTarget); return; } if(GetHasFeat(FEAT_PRESTIGE_HAIL_OF_ARROWS)) { ActionUseFeat(FEAT_PRESTIGE_HAIL_OF_ARROWS, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_PRESTIGE_HAIL_OF_ARROWS); ActionAttack(oTarget); return; } if(GetHasFeat(FEAT_PRESTIGE_IMBUE_ARROW)) { ActionUseFeat(FEAT_PRESTIGE_IMBUE_ARROW, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_PRESTIGE_IMBUE_ARROW); ActionAttack(oTarget); return; } if(GetHasFeat(FEAT_PRESTIGE_SEEKER_ARROW_2)) { ActionUseFeat(FEAT_PRESTIGE_SEEKER_ARROW_2, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_PRESTIGE_SEEKER_ARROW_2); ActionAttack(oTarget); return; } if(GetHasFeat(FEAT_PRESTIGE_SEEKER_ARROW_1)) { ActionUseFeat(FEAT_PRESTIGE_SEEKER_ARROW_1, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_PRESTIGE_SEEKER_ARROW_1); ActionAttack(oTarget); return; } } //Occasionally use active feats int nRand = Random(5); int nFeat = -1; object oRanged = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,OBJECT_SELF); if(nRand == 0 && GetHasFeat(FEAT_CALLED_SHOT)) { nFeat = FEAT_CALLED_SHOT; } else if(nRand == 1 && GetHasFeat(FEAT_RAPID_SHOT)) { if(IsBow(oRanged) && nArQty > 0) nFeat = FEAT_RAPID_SHOT; if(IsSling(oRanged) && nBuQty > 0) nFeat = FEAT_RAPID_SHOT; } else if(nRand == 2 && GetHasFeat(FEAT_RAPID_RELOAD)) { if(IsCrossbow(oRanged) && nBoQty > 0) nFeat = FEAT_RAPID_RELOAD; } if(nFeat != -1) { ClearAllActions(); ActionUseFeat(nFeat, oTarget); } if(SpecialTacticsRanged(oTarget)) return; OAI_WrapperActionAttack(oTarget); } //Religious Melee Combat void MeleeReligious(object oTarget,object oCreature = OBJECT_SELF) { //First Try Divine Spells int nWeapon = FALSE; if(TrySpell(SPELL_DIVINE_POWER, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_DIVINE_FAVOR, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; //Now Try to Enhance Weapon if(TrySpell(SPELL_HOLY_SWORD, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_GREATER_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_DARKFIRE, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_BLESS_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_DEAFENING_CLANG, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; //Now Try Feats if(GetHasFeat(FEAT_DIVINE_MIGHT) && !GetHasSpellEffect(473)) { ActionUseFeat(FEAT_DIVINE_MIGHT, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_DIVINE_MIGHT); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_DIVINE_SHIELD) && !GetHasSpellEffect(474)) { ActionUseFeat(FEAT_DIVINE_SHIELD, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_DIVINE_SHIELD); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_DIVINE_WRATH) && !GetHasSpellEffect(474)) { ActionUseFeat(FEAT_DIVINE_WRATH, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_DIVINE_WRATH); OAI_WrapperActionAttack(oTarget); return; } if(GetLevelByClass(CLASS_TYPE_SHADOWDANCER) && d4() == 1 && GetHasFeat(FEAT_SHADOW_DAZE)) { ActionUseFeat(FEAT_SHADOW_DAZE,oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SHADOW_DAZE); OAI_WrapperActionAttack(oTarget); return; } //Fall Through DetermineCombatRound(oTarget); } //Smite Melee Combat void MeleeSmite(object oTarget,object oCreature = OBJECT_SELF) { //Now Try to Enhance Weapon int nWeapon = FALSE; if(TrySpell(SPELL_HOLY_SWORD, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_GREATER_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_DARKFIRE, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_BLESS_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_DEAFENING_CLANG, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(GetHasFeat(FEAT_SMITE_EVIL) && GetAlignmentGoodEvil(oTarget) == ALIGNMENT_EVIL) { ActionUseFeat(FEAT_SMITE_EVIL, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SMITE_EVIL); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_SMITE_GOOD) && GetAlignmentGoodEvil(oTarget) == ALIGNMENT_GOOD) { ActionUseFeat(FEAT_SMITE_GOOD, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SMITE_GOOD); OAI_WrapperActionAttack(oTarget); return; } //Turn Off Smite Melee and Fight Normal IF No More Smites if(!GetHasFeat(FEAT_SMITE_EVIL) && !GetHasFeat(FEAT_SMITE_GOOD)) { SetStatusCondition(OAI_I_CAN_SMITE_MELEE,FALSE); OAI_WrapperActionAttack(oTarget); return; } //Fall Through DetermineCombatRound(oTarget); } //Sneak Melee Combat void MeleeSneak(object oTarget,object oCreature = OBJECT_SELF) { //Why Am I Here? if(!GetHasFeat(FEAT_SNEAK_ATTACK)) { OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_SHADOW_EVADE) && !GetHasSpellEffect(SPELL_SHADOW_EVADE)) { ActionUseFeat(FEAT_SHADOW_EVADE, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SHADOW_EVADE); OAI_WrapperActionAttack(oTarget); return; } else if(GetHasFeat(FEAT_PRESTIGE_INVISIBILITY_1) && !GetHasSpellEffect(SPELL_SHADOW_EVADE)) { ActionUseFeat(FEAT_PRESTIGE_INVISIBILITY_1, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_PRESTIGE_INVISIBILITY_1); OAI_WrapperActionAttack(oTarget); return; } else if(GetHasFeat(FEAT_PRESTIGE_SPELL_GHOSTLY_VISAGE) && !GetHasSpellEffect(SPELL_SHADOW_EVADE)) { ActionUseFeat(FEAT_PRESTIGE_SPELL_GHOSTLY_VISAGE, OBJECT_SELF); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_PRESTIGE_SPELL_GHOSTLY_VISAGE); OAI_WrapperActionAttack(oTarget); return; } if(GetHasFeat(FEAT_SHADOW_DAZE) && !GetHasFeatEffect(FEAT_SHADOW_DAZE, oTarget)) { ActionUseFeat(FEAT_SHADOW_DAZE, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SHADOW_DAZE); OAI_WrapperActionAttack(oTarget); return; } if(SpecialTacticsAmbusher(oTarget)) return; //Fall Through DetermineCombatRound(oTarget); } //Weapon Master Melee Combat void MeleeWeaponMaster(object oTarget,object oCreature = OBJECT_SELF) { //Weapon Master Ki Damage if(TryKiDamage(oTarget) && d2() == 1) return; //Try a Whirlwind Attack if(TryToWhirl(OBJECT_SELF)) return; //Fall Through DetermineCombatRound(oTarget); } //Palemaster Melee Combat void MeleePalemaster(object oTarget,object oCreature = OBJECT_SELF) { //Try to Enhance Weapon int nWeapon = FALSE; if(TrySpell(SPELL_BLACKSTAFF, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_GREATER_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_FLAME_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_KEEN_EDGE, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(GetHasFeat(FEAT_DEATHLESS_MASTER_TOUCH)) { ActionUseFeat(FEAT_DEATHLESS_MASTER_TOUCH, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_DEATHLESS_MASTER_TOUCH); ActionAttack(oTarget); return; } if(GetHasFeat(FEAT_UNDEAD_GRAFT_2)) { ActionUseFeat(FEAT_UNDEAD_GRAFT_2, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_UNDEAD_GRAFT_2); ActionAttack(oTarget); return; } if(GetHasFeat(FEAT_UNDEAD_GRAFT_1)) { ActionUseFeat(FEAT_UNDEAD_GRAFT_1, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_UNDEAD_GRAFT_1); ActionAttack(oTarget); return; } //Done with Melee....Lets go back to Being Just a Caster SetStatusCondition(OAI_I_CAN_PM_MELEE,FALSE); DetermineCombatRound(oTarget); } //Dragon Disciple Melee Combat void MeleeRDD(object oTarget,object oCreature = OBJECT_SELF) { //Try to Enhance Weapon int nWeapon = FALSE; if(TrySpell(SPELL_BLACKSTAFF, OBJECT_SELF) && nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_GREATER_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_MAGIC_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_FLAME_WEAPON, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(TrySpell(SPELL_KEEN_EDGE, OBJECT_SELF)&& nWeapon == FALSE) nWeapon = TRUE; if(GetHasFeat(FEAT_DRAGON_DIS_BREATH) && d2() == 1) { ActionCastSpellAtObject(690, GetNearestEnemy(), METAMAGIC_ANY, TRUE); DecrementRemainingFeatUses(OBJECT_SELF, FEAT_DRAGON_DIS_BREATH); OAI_WrapperActionAttack(oTarget); return; } //Fall Through DetermineCombatRound(oTarget); } //Shifter Melee Combat void MeleeShifter(object oTarget,object oCreature = OBJECT_SELF) { //The Shifter Chooses Which Wildshape They Wish if(GetHasFeat(FEAT_WILD_SHAPE) && !GetHasEffect(EFFECT_TYPE_POLYMORPH, OBJECT_SELF) && GetDistanceToObject(oTarget) < 10.0) { // Dragon Shape if(TrySpell(725, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); SetBattleCondition(OAI_ROLE_DRAGON); DetermineCombatRound(oTarget); return; } // Construct Shape if(TrySpell(737, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Undead Shape if(TrySpell(685, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Outsider Shape - Black Slaad if(TrySpell(735, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_CAST_SPELLS); SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Outsider Shape - Azer Chieftain if(TrySpell(733, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Outsider Shape - Rakshasa if(TrySpell(734, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_CAST_SPELLS); SetBattleCondition(OAI_ROLE_AOE_SPECIALIST); SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Human Shape - Drow if(TrySpell(682, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Human Shape - Lizardman if(TrySpell(683, OBJECT_SELF)) { SetBattleCondition(OAI_COMBAT_FLAG_RANGED); SetCombatCondition(X0_COMBAT_FLAG_RANGED); SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Human Shape - Kobold Commando if(TrySpell(684, OBJECT_SELF)) { SetBattleCondition(OAI_COMBAT_FLAG_AMBUSHER); SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER); SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Large Dire Tiger if(TrySpell(694, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Medusa if(TrySpell(679, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // MindFlayer if(TrySpell(691, OBJECT_SELF)) { SetBattleCondition(OAI_ROLE_MINDFLAYER); SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Greater Wildshape III if(TrySpell(676, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Greater Wildshape II if(TrySpell(675, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } // Greater Wildshape I if(TrySpell(646, OBJECT_SELF)) { SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } if(GetHasFeat(FEAT_WILD_SHAPE) && !GetHasSpellEffect(320)) { ActionUseFeat(FEAT_WILD_SHAPE, OBJECT_SELF); SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); return; } return; } SetStatusCondition(OAI_I_CAN_POLYMORPH, FALSE); DetermineCombatRound(oTarget); } //Monk Melee Combat void MeleeMonk(object oTarget,object oCreature = OBJECT_SELF) { object oMyWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND); int nHaveWeapon = GetIsObjectValid(oMyWeapon); int nAC = GetAC(oTarget); float fAttack; int nAttack = GetHitDice(OBJECT_SELF); int nWIS = GetAbilityModifier(ABILITY_WISDOM); int nSTR = GetAbilityModifier(ABILITY_STRENGTH); int nFS = GetFortitudeSavingThrow(oTarget); int nDiff = nAC - nAttack; if(GetHasFeat(FEAT_QUIVERING_PALM)) { if((!nHaveWeapon || GetBaseItemType(oMyWeapon) == BASE_ITEM_KAMA) && GetRacialType(oTarget) != RACIAL_TYPE_CONSTRUCT && GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD) { //Can insta-kill. Roll is DC10 + 0.5 * monks level + wis modifier vs Fort int nRoll = d10() + (nAttack/2) + nWIS; if(nRoll > nFS) { ActionUseFeat(FEAT_QUIVERING_PALM, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_QUIVERING_PALM); ActionAttack(oTarget); return; } } } if(!GetHasFeatEffect(FEAT_SAP, oTarget) && !GetHasFeatEffect(FEAT_STUNNING_FIST, oTarget) && !nHaveWeapon) { if(GetHasFeat(FEAT_STUNNING_FIST) && nDiff > 0) { ActionUseFeat(FEAT_STUNNING_FIST, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_STUNNING_FIST); ActionAttack(oTarget); return; } if(GetHasFeat(FEAT_SAP) && nDiff > 0) { ActionUseFeat(FEAT_SAP, oTarget); DecrementRemainingFeatUses(OBJECT_SELF,FEAT_SAP); ActionAttack(oTarget); return; } } if(GetHasFeat(FEAT_FLURRY_OF_BLOWS) && (nDiff - 1) > 0 && (!nHaveWeapon || GetBaseItemType(oMyWeapon) == BASE_ITEM_KAMA)) { ActionUseFeat(FEAT_FLURRY_OF_BLOWS, oTarget); ActionAttack(oTarget); return; } //50% Use Defensive Tactics if(d2() == 1) { if(SpecialTacticsDefensive(oTarget)) return; } //Fall Through DetermineCombatRound(oTarget); } void BlinkMove() { vector vWho = GetPosition(OBJECT_SELF); float fWho; location lWho; location lOld = GetLocation(OBJECT_SELF); effect eBlink=EffectVisualEffect(GetLocalInt(OBJECT_SELF, "OAI_BLINK_FX")); int iX, iY; while(iX==0 && iY==0) { iX = (Random(7) - 3) * 2; iY = (Random(7) - 3) * 2; } vWho.x += IntToFloat(iX); vWho.y += IntToFloat(iY); iX=Random(3601); fWho=IntToFloat(iX) / 10.0; lWho=Location(GetArea(OBJECT_SELF), vWho, fWho); ClearAllActions(); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eBlink, lOld); DelayCommand(0.5, JumpToLocation(lWho)); DelayCommand(1.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eBlink, lWho)); ActionDoCommand(SetFacing(fWho)); if(GetIsPC(OBJECT_SELF)) SetCameraFacing(fWho); } void BlinkMelee(object oTarget) { vector vWho = GetPosition(oTarget); float fWho = GetFacing(oTarget); location lWho; location lOld = GetLocation(OBJECT_SELF); effect eBlink=EffectVisualEffect(GetLocalInt(OBJECT_SELF, "OAI_BLINK_FX")); int iX, iY; while(iX==0 && iY==0) { iX = (Random(5) - 2); iY = (Random(5) - 2); } vWho.x += IntToFloat(iX); vWho.y += IntToFloat(iY); lWho=Location(oArea, vWho, fWho); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eBlink, lOld); DelayCommand(0.5, JumpToLocation(lWho)); DelayCommand(1.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eBlink, lWho)); } void SetUpBarbarian(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); //Good/Evil int nAlign = GetAlignmentGoodEvil(oCreature); int nMoral = GetAlignmentLawChaos(oCreature); //Dex or Strength Based Barbarian if(nDEX > nSTR) { SetStatusCondition(OAI_I_CAN_DEX_MELEE); SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } else SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); if(nAlign == ALIGNMENT_GOOD) { if(GetLevelByClass(CLASS_TYPE_DIVINECHAMPION)) { SetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE); } } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpBard(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); //Good/Evil int nAlign = GetAlignmentGoodEvil(oCreature); int nMoral = GetAlignmentLawChaos(oCreature); SetStatusCondition(OAI_I_CAN_CAST_SPELLS); if(GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER)) { SetBattleCondition(OAI_COMBAT_FLAG_RANGED); } if(nAlign == ALIGNMENT_GOOD) { if(GetLevelByClass(CLASS_TYPE_DIVINECHAMPION)) { SetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE); } } if(GetLevelByClass(CLASS_TYPE_DWARVENDEFENDER)) { SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); } if(GetLevelByClass(CLASS_TYPE_PALEMASTER)) { SetStatusCondition(OAI_I_CAN_PM_MELEE); } if(GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE)) { SetStatusCondition(OAI_I_CAN_RDD_MELEE); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpCleric(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); //Good/Evil int nAlign = GetAlignmentGoodEvil(oCreature); int nMoral = GetAlignmentLawChaos(oCreature); SetStatusCondition(OAI_I_CAN_CAST_SPELLS); SetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE); //Zen Archery if(GetHasFeat(FEAT_ZEN_ARCHERY)) { SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } if(nAlign == ALIGNMENT_GOOD) { if(GetLevelByClass(CLASS_TYPE_DIVINECHAMPION)) { SetStatusCondition(OAI_I_CAN_SMITE_MELEE); } } if(GetLevelByClass(CLASS_TYPE_DWARVENDEFENDER)) { SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpDruid(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); SetStatusCondition(OAI_I_CAN_CAST_SPELLS); //Zen Archery if(GetHasFeat(FEAT_ZEN_ARCHERY)) { SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } if(GetLevelByClass(CLASS_TYPE_SHIFTER)) { SetStatusCondition(OAI_I_CAN_SHIFTER_MELEE); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpFighter(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); //Good/Evil int nAlign = GetAlignmentGoodEvil(oCreature); int nMoral = GetAlignmentLawChaos(oCreature); //Dex or Strength Based Fighter if(nDEX > nSTR) { SetStatusCondition(OAI_I_CAN_DEX_MELEE); SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } else SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); if(nAlign == ALIGNMENT_GOOD) { if(GetLevelByClass(CLASS_TYPE_DIVINECHAMPION)) { SetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE); } } if(GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER)) { SetBattleCondition(OAI_COMBAT_FLAG_RANGED); } if(GetLevelByClass(CLASS_TYPE_DWARVENDEFENDER)) { SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpMonk(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); int nWIS = GetAbilityModifier(ABILITY_WISDOM,oCreature); //Good/Evil int nAlign = GetAlignmentGoodEvil(oCreature); int nMoral = GetAlignmentLawChaos(oCreature); //Dex or Strength Based Monk if(nDEX > nSTR || nWIS >= 0) { SetStatusCondition(OAI_I_CAN_MONK_MELEE); SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } else SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); if(nAlign == ALIGNMENT_GOOD) { if(GetLevelByClass(CLASS_TYPE_DIVINECHAMPION)) { SetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE); } } if(GetLevelByClass(CLASS_TYPE_DWARVENDEFENDER)) { SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpPaladin(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); //Good/Evil int nAlign = GetAlignmentGoodEvil(oCreature); int nMoral = GetAlignmentLawChaos(oCreature); //Dex or Strength Based Paladin if(nDEX > nSTR) { SetStatusCondition(OAI_I_CAN_DEX_MELEE); SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } else SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); //Zen Archery if(GetHasFeat(FEAT_ZEN_ARCHERY)) { SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } //Paladin Smite SetStatusCondition(OAI_I_CAN_SMITE_MELEE); if(nAlign == ALIGNMENT_GOOD) { if(GetLevelByClass(CLASS_TYPE_DIVINECHAMPION)) { SetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE); } } if(GetLevelByClass(CLASS_TYPE_DWARVENDEFENDER)) { SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpRanger(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); //Good/Evil int nAlign = GetAlignmentGoodEvil(oCreature); int nMoral = GetAlignmentLawChaos(oCreature); //Ranger Melee if(nDEX > nSTR) { SetStatusCondition(OAI_I_CAN_DEX_MELEE); SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } else SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); //Zen Archery if(GetHasFeat(FEAT_ZEN_ARCHERY)) { SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } if(GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER)) { SetBattleCondition(OAI_COMBAT_FLAG_RANGED); } if(nAlign == ALIGNMENT_GOOD) { if(GetLevelByClass(CLASS_TYPE_DIVINECHAMPION)) { SetStatusCondition(OAI_I_CAN_RELIGIOUS_MELEE); } if(GetLevelByClass(CLASS_TYPE_HARPER)) { SetBattleCondition(OAI_ROLE_BUFFER); } } if(GetLevelByClass(CLASS_TYPE_DWARVENDEFENDER)) { SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpRogue(object oCreature) { //Personal Modifiers int nSTR = GetAbilityModifier(ABILITY_STRENGTH,oCreature); int nDEX = GetAbilityModifier(ABILITY_DEXTERITY,oCreature); //Rogue Melee if(nDEX > nSTR) { SetStatusCondition(OAI_I_CAN_DEX_MELEE); SetStatusCondition(OAI_I_CAN_FIGHT_RANGED); } else SetStatusCondition(OAI_I_CAN_FIGHT_MELEE); if(GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER)) { SetBattleCondition(OAI_COMBAT_FLAG_RANGED); } if(GetLevelByClass(CLASS_TYPE_WEAPON_MASTER)) { SetStatusCondition(OAI_I_CAN_WM_MELEE); } } void SetUpSorcerer(object oCreature) { SetStatusCondition(OAI_I_CAN_CAST_SPELLS); if(GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER)) { SetBattleCondition(OAI_COMBAT_FLAG_RANGED); } if(GetLevelByClass(CLASS_TYPE_PALEMASTER)) { SetStatusCondition(OAI_I_CAN_PM_MELEE); } if(GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE)) { SetStatusCondition(OAI_I_CAN_RDD_MELEE); } } void SetUpWizard(object oCreature) { SetStatusCondition(OAI_I_CAN_CAST_SPELLS); if(GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER)) { SetBattleCondition(OAI_COMBAT_FLAG_RANGED); } if(GetLevelByClass(CLASS_TYPE_PALEMASTER)) { SetStatusCondition(OAI_I_CAN_PM_MELEE); } } int OAI_MindFlayerCombat(object oTarget) { SetBattleCondition(OAI_BLINK_SELF); int nChoice = 1; //Go Melee Against Petrified Targets if(GetHasEffect(EFFECT_TYPE_PETRIFY, oTarget) == TRUE) nChoice = 1; else if(GetIsPlayableRacialType(oTarget) && MFGetTargetConditionSucks(oTarget) || GetSubRace(oTarget)== "Tiefling") { nChoice = 2; } //If the target is down below 10 hp and AC is below 23, we go into melee as well else if(GetCurrentHitPoints(oTarget) < 10 && GetAC(oTarget) < 23) nChoice = 1; if(nChoice == 2) { if(GetDistanceBetween(OBJECT_SELF, oTarget) < 1.5f) { ActionMoveAwayFromObject(oTarget, FALSE, 1.5f); } ActionMoveToObject(oTarget, FALSE, 1.5f); ActionDoCommand(SetFacingPoint(GetPositionFromLocation(GetLocation(oTarget)))); ActionWait(0.5f); if(MFGetTargetConditionSucks(oTarget)) { ActionCastSpellAtObject(716, oTarget,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT); return TRUE; } //70% Chance Of Special Mind blast else if(d100() <= 70) { ActionCastSpellAtObject(551, oTarget,METAMAGIC_ANY,TRUE,0,PROJECTILE_PATH_TYPE_DEFAULT); return TRUE; } //Spells else { int nN = caiGetAvailableCombatSpell(OBJECT_SELF, oTarget); if(nN > 0) { ActionCastSpellAtObject(nN,oTarget); return TRUE; } else { if(WhatToDoAfterCasting(OBJECT_SELF)){} else ActionAttack(oTarget); } } } return FALSE; } int MFGetTargetConditionSucks(object oTarget) { if(GetHasEffect(EFFECT_TYPE_POLYMORPH, oTarget) == TRUE) return FALSE; if(GetHasEffect(EFFECT_TYPE_STUNNED, oTarget) || GetHasEffect(EFFECT_TYPE_PARALYZE, oTarget) || GetHasEffect(VFX_DUR_PARALYZE_HOLD, oTarget) || GetHasEffect(VFX_DUR_PARALYZE_HOLD, oTarget) ) { return TRUE; } else { // if dazed, try to brainsuck only 30% of the time) if(GetHasEffect(EFFECT_TYPE_DAZED, oTarget) && (Random(100) < 30) ) { return TRUE; } return FALSE; } } int OAI_SpiderTactics(object oTarget) { //Find the Weakest Enemy object oWeakest = GetFactionMostDamagedMember(oTarget); location lLoc = GetLocation(OBJECT_SELF); location lWeakest = GetLocation(oWeakest); if(GetDistanceToObject(oWeakest) > 4.0) { ClearAllActions(); effect eVis = EffectDisappearAppear(lWeakest); effect eWeb = EffectVisualEffect(VFX_DUR_WEB); DelayCommand(0.3,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, OBJECT_SELF, 2.0)); DelayCommand(2.3,ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eWeb, lLoc, 2.0)); DelayCommand(5.0,ActionAttack(oWeakest)); return TRUE; } return FALSE; } //: AI FUNCTIONS /******************************************************************************/ /******************************************************************************/ //: HENCHMAN FUNCTIONS (Most By Bioware from x0_inc_henai Integrated for OAI) void SendForHelp() { if(!GetIsPC(GetFactionLeader(OBJECT_SELF))) return; object oParty = GetFirstFactionMember(OBJECT_SELF, FALSE); while (GetIsObjectValid(oParty) == TRUE) { SignalEvent(oParty, EventUserDefined(46500)); oParty = GetNextFactionMember(OBJECT_SELF, FALSE); } } void bkSetListeningPatterns() { SetListening(OBJECT_SELF, TRUE); SetListenPattern(OBJECT_SELF, "inventory",101); SetListenPattern(OBJECT_SELF, "pick",102); SetListenPattern(OBJECT_SELF, "trap", 103); } int bkGetIsInLineOfSight(object oTarget,object oSeer=OBJECT_SELF) { if(GetDistanceBetween(oTarget, oSeer) < 6.0) return TRUE; return LineOfSightObject(oSeer, oTarget); } float bkGetCosAngleBetween(object Loc1, object Loc2) { vector v1 = GetPositionFromLocation(GetLocation(Loc1)); vector v2 = GetPositionFromLocation(GetLocation(Loc2)); vector v3 = GetPositionFromLocation(GetLocation(OBJECT_SELF)); v1.x -= v3.x; v1.y -= v3.y; v1.z -= v3.z; v2.x -= v3.x; v2.y -= v3.y; v2.z -= v3.z; float dotproduct = v1.x*v2.x+v1.y*v2.y+v1.z*v2.z; return dotproduct/(VectorMagnitude(v1)*VectorMagnitude(v2)); } int bkGetIsDoorInLineOfSight(object oTarget) { float fMeDoorDist; object oView = GetFirstObjectInShape(SHAPE_SPHERE, 40.0, GetLocation(OBJECT_SELF), TRUE,OBJECT_TYPE_DOOR); float fMeTrapDist = GetDistanceBetween(oTarget,OBJECT_SELF); while (GetIsObjectValid(oView)) { fMeDoorDist = GetDistanceBetween(oView,OBJECT_SELF); if(fMeDoorDist < fMeTrapDist && !GetIsTrapped(oView)) { if(GetIsDoorActionPossible(oView,DOOR_ACTION_OPEN) || GetIsDoorActionPossible(oView,DOOR_ACTION_UNLOCK)) { float fAngle = bkGetCosAngleBetween(oView,oTarget); if(fAngle > 0.5) return TRUE; } } oView = GetNextObjectInShape(SHAPE_SPHERE,40.0, GetLocation(OBJECT_SELF), TRUE, OBJECT_TYPE_DOOR); } return FALSE; } int bkManualPickNearestLock() { object oLastObject = GetLockedObject(GetMaster()); return bkAttemptToOpenLock(oLastObject); } int bkAttemptToDisarmTrap(object oTrap, int bWasShout = FALSE) { if(GetIsTrapped(oTrap) == FALSE) return FALSE; // * June 2003. If in 'do not disarm trap' mode, then do not disarm traps if(!GetAssociateState(NW_ASC_DISARM_TRAPS)) { return FALSE; } int bValid = GetIsObjectValid(oTrap); int bISawTrap = GetTrapDetectedBy(oTrap, OBJECT_SELF); int bCloseEnough = GetDistanceToObject(oTrap) <= 15.0; int bInLineOfSight = bkGetIsInLineOfSight(oTrap); if(bValid == FALSE || bISawTrap == FALSE || bCloseEnough == FALSE || bInLineOfSight == FALSE) { if(bWasShout == TRUE) VoiceCannotDo(); return FALSE; } SetLocalObject(OBJECT_SELF, "NW_ASSOCIATES_LAST_TRAP", oTrap); string sID = ObjectToString(oTrap); int nSkill = GetSkillRank(SKILL_DISABLE_TRAP); int nTrapDC = GetTrapDisarmDC(oTrap); if( nSkill > 0 && (nSkill + 20) >= nTrapDC && GetTrapDisarmable(oTrap)) { ClearAllActions(); ActionUseSkill(SKILL_DISABLE_TRAP, oTrap); ActionDoCommand(SetCommandable(TRUE)); ActionDoCommand(VoiceTaskComplete()); SetCommandable(FALSE); return TRUE; } else if (GetHasSpell(SPELL_FIND_TRAPS) && GetTrapDisarmable(oTrap) && GetLocalInt(oTrap, "NW_L_IATTEMPTEDTODISARMNOWORK") ==0) { ClearAllActions(); ActionCastSpellAtObject(SPELL_FIND_TRAPS, oTrap); SetLocalInt(oTrap, "NW_L_IATTEMPTEDTODISARMNOWORK", 10); return TRUE; } else if(bWasShout) { ClearAllActions(); if(GetLocalInt(OBJECT_SELF, "X0_L_SAWTHISTRAPALREADY" + sID) != 10) { string sSpeak = GetStringByStrRef(40551); SendMessageToPC(GetMaster(), sSpeak); SetLocalInt(OBJECT_SELF, "X0_L_SAWTHISTRAPALREADY" + sID, 10); } if(GetObjectType(oTrap) != OBJECT_TYPE_TRIGGER) { ActionAttack(oTrap); SetLocalObject(OBJECT_SELF, "NW_GENERIC_DOOR_TO_BASH", oTrap); return TRUE; } //Throw ourselves on it nobly! :-) ActionMoveToLocation(GetLocation(oTrap)); SetFacingPoint(GetPositionFromLocation(GetLocation(oTrap))); ActionRandomWalk(); return TRUE; } else if(nSkill > 0) { if(GetLocalInt(OBJECT_SELF, "X0_L_SAWTHISTRAPALREADY" + sID) != 10) { VoiceCannotDo(); SetLocalInt(OBJECT_SELF, "X0_L_SAWTHISTRAPALREADY" + sID, 10); string sSpeak = GetStringByStrRef(40551); SendMessageToPC(GetMaster(), sSpeak); } return FALSE; } return FALSE; } int AttemptKnockSpell(object oLocked) { // If that didn't work, let's try using a knock spell if(GetHasSpell(SPELL_KNOCK) && (GetIsDoorActionPossible(oLocked,DOOR_ACTION_KNOCK) || GetIsPlaceableObjectActionPossible(oLocked,PLACEABLE_ACTION_KNOCK))) { if(bkGetIsDoorInLineOfSight(oLocked) == FALSE) { if(LineOfSightObject(OBJECT_SELF, oLocked) == TRUE) { ClearAllActions(); VoiceCanDo(); ActionWait(1.0); ActionCastSpellAtObject(SPELL_KNOCK, oLocked); ActionWait(1.0); return TRUE; } } } return FALSE; } int bkAttemptToOpenLock(object oLocked) { if(GetLocalInt(oLocked, "X2_L_BASH_FALSE") == 1) return FALSE; int bNeedKey = FALSE; int bInLineOfSight = TRUE; if(GetLockKeyRequired(oLocked) == TRUE) bNeedKey = TRUE; if(!GetIsObjectValid(oLocked) || bNeedKey == TRUE || bInLineOfSight == FALSE) { VoiceCannotDo(); return FALSE; } int bCanDo = FALSE; //First, let's see if we notice that it's trapped if(GetIsTrapped(oLocked) && GetTrapDetectedBy(oLocked, OBJECT_SELF)) { if(!bkAttemptToDisarmTrap(oLocked)) { if(AttemptKnockSpell(oLocked) == TRUE) return TRUE; VoiceNo(); return FALSE; } } //Now, let's try and pick the lock first int nSkill = GetSkillRank(SKILL_OPEN_LOCK); if(nSkill > 0) { nSkill += GetAbilityModifier(ABILITY_DEXTERITY); nSkill += 20; } if(nSkill > GetLockUnlockDC(oLocked) && (GetIsDoorActionPossible(oLocked,DOOR_ACTION_UNLOCK) || GetIsPlaceableObjectActionPossible(oLocked,PLACEABLE_ACTION_UNLOCK))) { ClearAllActions(); VoiceCanDo(); ActionWait(1.0); ActionUseSkill(SKILL_OPEN_LOCK,oLocked); ActionWait(1.0); bCanDo = TRUE; } if(!bCanDo) bCanDo = AttemptKnockSpell(oLocked); if(!bCanDo && !GetPlotFlag(oLocked) && (GetIsDoorActionPossible(oLocked,DOOR_ACTION_BASH) || GetIsPlaceableObjectActionPossible(oLocked,PLACEABLE_ACTION_BASH))) { ClearAllActions(); VoiceCanDo(); ActionWait(1.0); ActionAttack(oLocked); SetLocalObject(OBJECT_SELF, "NW_GENERIC_DOOR_TO_BASH", oLocked); bCanDo = TRUE; } if(!bCanDo && !GetPlotFlag(oLocked) && GetHasSpell(SPELL_MAGIC_MISSILE)) { ClearAllActions(); ActionCastSpellAtObject(SPELL_MAGIC_MISSILE,oLocked); return TRUE; } if(!bCanDo) { VoiceCannotDo(); } else { ActionDoCommand(VoiceTaskComplete()); return TRUE; } return FALSE; } int bkCombatAttemptHeal() { object oMaster = GetMaster(); if(MatchDoIHaveAMindAffectingSpellOnMe(oMaster)) { if(GetHasSpell(SPELL_DISPEL_MAGIC, OBJECT_SELF) ) { ClearAllActions(); ActionCastSpellAtLocation(SPELL_DISPEL_MAGIC, GetLocation(oMaster)); return TRUE; } } int iHealMelee = TRUE; if(bkGetBehavior(BK_HEALINMELEE) == FALSE) iHealMelee = FALSE; object oNearestEnemy = GetNearestSeenEnemy(); float fDistance = 0.0; if(GetIsObjectValid(oNearestEnemy)) { fDistance = GetDistanceToObject(oNearestEnemy); } int iHP = GetPercentageHPLoss(OBJECT_SELF); // if less than 10% hitpoints then pretend that I am allowed // to heal in melee. Things are getting desperate if(iHP < 10) iHealMelee = TRUE; int iAmFamiliar = (GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oMaster) == OBJECT_SELF); // * must be out of Melee range or ALLOWED to heal in melee if(fDistance > BK_HEALTHRESHOLD || iHealMelee) { int iAmHenchman = GetAssociateType(OBJECT_SELF) == ASSOCIATE_TYPE_HENCHMAN; int iAmCompanion = (GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oMaster) == OBJECT_SELF); int iAmSummoned = (GetAssociate(ASSOCIATE_TYPE_SUMMONED,oMaster) == OBJECT_SELF); // Condition for immediate self-healing // Hit-point at less than 50% and random chance if(iHP < 50) { if(iAmHenchman || iAmFamiliar) { if(iHP < 10 && Random(5) == 0) VoiceNearDeath(); if(d100() > iHP-20) { ClearAllActions(); if(TalentHealingSelf()) return TRUE; if(iAmHenchman || iAmFamiliar) { if(Random(100) > 80) VoiceHealMe(); } } } if(GetAssociateHealMaster()) { if(TalentHeal()) return TRUE; else return FALSE; } } } // * No healing done, continue with combat round return FALSE; } int bkGetBehavior(int nBehavior) { return GetLocalInt(OBJECT_SELF, "NW_L_BEHAVIOR" + IntToString(nBehavior)); } void bkSetBehavior(int nBehavior, int nValue) { SetLocalInt(OBJECT_SELF, "NW_L_BEHAVIOR"+IntToString(nBehavior), nValue); } int bkCombatFollowMaster() { object oMaster = GetMaster(); int iAmHenchman = (GetHenchman(oMaster) == OBJECT_SELF); int iAmFamiliar = (GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oMaster) == OBJECT_SELF); if(bkGetBehavior(BK_CURRENT_AI_MODE) != BK_AI_MODE_RUN_AWAY) { float fFollowThreshold = BK_FOLLOW_THRESHOLD; if (GetIsInCombat(OBJECT_SELF) == TRUE) { fFollowThreshold = BK_FOLLOW_THRESHOLD * 2.0; } if(GetDistanceToObject(oMaster) > fFollowThreshold) { if(GetCurrentAction(oMaster) != ACTION_FOLLOW) { ClearAllActions(); ActionForceFollowObject(GetMaster(), GetFollowDistance()); return TRUE; } } } if(bkGetBehavior(BK_NEVERFIGHT) == TRUE) { ClearAllActions(); if(d10() > 7) { if(iAmHenchman || iAmFamiliar) { VoiceLookHere(); return TRUE; } } } return FALSE; } /******************************************************************************/ //:: NESS Functions for Henchman /* void OAI_SetSpawn(object oSpawn) { string sSpawnName, sSpawnTag, sSpawnVarName; object oArea = GetArea(oSpawn); int nSpawnNum = GetLocalInt(oArea,"Spawns") + 1; // Check for a local string called "NESS" on the waypoint // first. If it exists, use it instead of the name sSpawnName = GetLocalString(oSpawn, "NESS"); if (GetStringLeft(sSpawnName, 2) != "SP") { sSpawnName = GetName(oSpawn); } // Check if Waypoint is a Spawn Controller if (GetStringLeft(sSpawnName, 2) == "SP") { // Set Spawn sSpawnVarName = "Spawn" + PadIntToString(nSpawnNum, 2); SetLocalObject(oArea, sSpawnVarName, oSpawn); sSpawnTag = GetLocalString(oSpawn, "NESS_TAG"); if (sSpawnTag == "") { sSpawnTag = GetTag(oSpawn); } InitFlags(oSpawn, sSpawnName, sSpawnTag); SetLocalInt(oArea, "Spawns", nSpawnNum); } } void OAI_RemoveSpawn(object oSpawn) { object oArea = GetArea(oSpawn); int nSpawns = GetLocalInt(oArea, "Spawns"); int nNth; object oCurrent; object oMove; string sCurrent; string sMove; //Find the spawn we want to remove for(nNth = 1; nNth <= nSpawns; nNth++) { sCurrent = "Spawn" + PadIntToString(nNth, 2); oCurrent = GetLocalObject(oArea, sCurrent); if(oCurrent == oSpawn) { //Got it DeleteLocalObject(oArea, sCurrent); if(nNth != nSpawns && nSpawns > 1) { sMove ="Spawn" + PadIntToString(nSpawns, 2); oMove = GetLocalObject(oArea, sMove); DeleteLocalObject(oArea, sMove); SetLocalObject(oArea, sCurrent, oMove); } nSpawns--; SetLocalInt(oArea, "Spawns", nSpawns); break; } } } void OAI_HenchSpawn(location lLoc, string sResRef) { string sTResRef = "s" + sResRef; object oNew = CreateObject(OBJECT_TYPE_WAYPOINT, sTResRef, lLoc, FALSE); SetSpawn69(oNew); } //:: NESS Functions for Henchman /******************************************************************************/ void EquipHenchArmor(object oHench, object oArmor) { ActionEquipItem(oArmor, INVENTORY_SLOT_CHEST); object oMod = GetModule(); int nARMORLIGHT = GetLocalInt(oMod,"ARMORLIGHT"); int nARMORMED = GetLocalInt(oMod,"ARMORMED"); int nARMORHEAVY = GetLocalInt(oMod,"ARMORHEAVY"); int nARMOR10 = GetLocalInt(oMod,"ARMOR10"); int nARMOR20 = GetLocalInt(oMod,"ARMOR20"); int nARMOR30 = GetLocalInt(oMod,"ARMOR30"); float fTime; int nNetAC = GetItemACValue(oArmor); int nBonus = IPGetWeaponEnhancementBonus(oArmor, ITEM_PROPERTY_AC_BONUS); int nBaseAC = nNetAC - nBonus; effect eVisual = EffectVisualEffect(VFX_DUR_PARALYZED); effect eChangingarmor = EffectCutsceneImmobilize(); effect eArmorpen; int nArmorType; if(nBaseAC > 0 && nBaseAC < 4) nArmorType = 1;//Light Armor Check else if(nBaseAC > 3 && nBaseAC < 6) nArmorType = 2;//Medium Armor Check else if(nBaseAC > 5) nArmorType = 3;//Heavy Armor Check else nArmorType = 0;//Clothing //Light Armor Speed Decrease if(nArmorType == 1) { if(nARMOR10 >= SML_CREATURE_MOVEPEN) { RemoveSpecificEffect(EFFECT_TYPE_MOVEMENT_SPEED_DECREASE, oHench); eArmorpen = SupernaturalEffect(EffectMovementSpeedDecrease(nARMOR10)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eArmorpen, oHench); } fTime = RoundsToSeconds(nARMORLIGHT); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eChangingarmor, oHench, fTime); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVisual, oHench, fTime); AssignCommand(oHench, DelayCommand(2.0, ActionDoCommand(ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, fTime-2.0)))); } //Medium Armor Speed Decrease if(nArmorType == 2) { if(nARMOR20 >= SML_CREATURE_MOVEPEN) { RemoveSpecificEffect(EFFECT_TYPE_MOVEMENT_SPEED_DECREASE, oHench); eArmorpen = SupernaturalEffect(EffectMovementSpeedDecrease(nARMOR20)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eArmorpen, oHench); } fTime = RoundsToSeconds(nARMORLIGHT); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eChangingarmor, oHench, fTime); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVisual, oHench, fTime); AssignCommand(oHench, DelayCommand(2.0, ActionDoCommand(ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, fTime-2.0)))); } //Heavy Armor Speed Decrease if(nArmorType == 3) { if(nARMOR30 >= SML_CREATURE_MOVEPEN) { RemoveSpecificEffect(EFFECT_TYPE_MOVEMENT_SPEED_DECREASE, oHench); eArmorpen = SupernaturalEffect(EffectMovementSpeedDecrease(nARMOR30)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eArmorpen, oHench); } fTime = RoundsToSeconds(nARMORLIGHT); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eChangingarmor, oHench, fTime); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVisual, oHench, fTime); AssignCommand(oHench, DelayCommand(2.0, ActionDoCommand(ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, fTime-2.0)))); } } void OAI_StoreCampaignHenchman(object oPC) { string sName = GetName(oPC); string sLeft = GetStringLeft(sName,4); string sDB = sLeft + "_" + GetLocalString(GetModule(), "COHORT_DB"); //Delete Previous DB object oHench = GetHenchman(oPC); StoreCampaignObject(sDB, sStoredHenchmanVarname, oHench, oPC); } void OAI_RetrieveCampaignHenchman(object oPC) { location lLoc = GetLocation(oPC); string sName = GetName(oPC); string sLeft = GetStringLeft(sName,4); string sDB = sLeft + "_" + GetLocalString(GetModule(), "COHORT_DB"); object oHench = RetrieveCampaignObject(sDB, sStoredHenchmanVarname, lLoc, OBJECT_INVALID, oPC); if(GetIsObjectValid(oHench)) { DelayCommand(1.5, HireHenchman(oPC, oHench)); } } //: HENCHMAN FUNCTIONS /******************************************************************************/ //void main(){}