70 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // Script Name: ai_a_cntrspell
 | |
| //////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
|  ai script for creatures using the combat mode counter spell.
 | |
|  OBJECT_SELF is the creature running the ai.
 | |
| */////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // Programmer: Philos
 | |
| //////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| #include "0i_actions"
 | |
| void main()
 | |
| {
 | |
|     object oCreature = OBJECT_SELF;
 | |
|     // Get the number of enemies that we are in melee combat with.
 | |
|     int nInMelee = ai_GetNumOfEnemiesInRange(oCreature);
 | |
|     // We are not in melee combat then we don't attack.
 | |
|     int bAttack = nInMelee;
 | |
|     if(!bAttack)
 | |
|     {
 | |
|         // If there are no casters, i.e. CLERIC or MAGES in the battle then attack.
 | |
|         struct stClasses stClasses = ai_GetFactionsClasses(oCreature);
 | |
|         if(!stClasses.CLERICS && !stClasses.MAGES) bAttack = TRUE;
 | |
|     }
 | |
|     // If we are not attacking and using magic then setup for counter spelling.
 | |
|     if(!bAttack && !ai_GetMagicMode(oCreature, AI_MAGIC_NO_MAGIC))
 | |
|     {
 | |
|         //***************************  HEALING & CURES  ****************************
 | |
|         if(ai_TryHealingTalent(oCreature, nInMelee)) return;
 | |
|         if(ai_TryCureConditionTalent(oCreature, nInMelee)) return;
 | |
|         int nDifficulty = ai_GetDifficulty(oCreature);
 | |
|         if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "30", " Counterspell Mode? " +
 | |
|                  IntToString(GetActionMode(OBJECT_SELF, ACTION_MODE_COUNTERSPELL)));
 | |
|         if(!GetActionMode(oCreature, ACTION_MODE_COUNTERSPELL))
 | |
|         {
 | |
|             object oTarget = ai_GetNearestClassTarget(oCreature, AI_CLASS_TYPE_CASTER);
 | |
|             // We can only counter spells from a hasted caster if we are hasted as well.
 | |
|             if(ai_GetHasEffectType(oTarget, EFFECT_TYPE_HASTE) &&
 | |
|               !ai_GetHasEffectType(oCreature, EFFECT_TYPE_HASTE))
 | |
|             {
 | |
|                 // If we have haste then we should cast it.
 | |
|                 if(GetHasSpell(SPELL_HASTE, oCreature))
 | |
|                 {
 | |
|                     if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "42", "Opponent is hasted! Casting Haste.");
 | |
|                     ActionCastSpellAtObject(SPELL_HASTE, oCreature);
 | |
|                     ai_SetLastAction(oCreature, SPELL_HASTE);
 | |
|                     return;
 | |
|                 }
 | |
|                 // If not then we need to go into normal combat.
 | |
|                 else
 | |
|                 {
 | |
|                     if(AI_DEBUG) ai_Debug("ai_cntrspell", "50", "Opponent is hasted! Using ranged AI.");
 | |
|                     ExecuteScript("ai_a_ranged");
 | |
|                     return;
 | |
|                 }
 | |
|             }
 | |
|             if(oTarget != OBJECT_INVALID)
 | |
|             {
 | |
|                 // First a good tactic for counter spelling is to be invisible.
 | |
|                 if(ai_TryToBecomeInvisible(oCreature)) return;
 | |
|                 // If we have attempted to become invisible or are invisible then
 | |
|                 // it is time to counter spell.
 | |
|                 if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "61", "Setting Counterspell mode!");
 | |
|                 ActionCounterSpell(oTarget);
 | |
|                 return;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     if(AI_DEBUG) ai_Debug("ai_a_cntrspell", "67", "Situation is not good for counterspelling! Using ranged AI.");
 | |
|     ExecuteScript("ai_a_ranged");
 | |
| }
 |