108 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*//////////////////////////////////////////////////////////////////////////////
 | |
|  Script: nw_ch_ac2
 | |
|  Programmer: Philos
 | |
| ////////////////////////////////////////////////////////////////////////////////
 | |
|   Associate(Summons, Familiars, Companions) OnPerception script when not in combat;
 | |
|   There are 4 types of perception - Heard, Inaudible, Seen, Vanished.
 | |
|   Only one type will ever be true in an event trigger.
 | |
|   The order of trigger is Heard/Seen and Inaudible/Vanished.
 | |
|   There are two states of percepion Heard and Seen.
 | |
|   These states can be set at the same time thus a heard event can see the creature.
 | |
|   Fires when ever one of these states changes from TRUE to FALSE or FALSE to TRUE.
 | |
| *///////////////////////////////////////////////////////////////////////////////
 | |
| #include "0i_associates"
 | |
| void main()
 | |
| {
 | |
|     object oCreature = OBJECT_SELF;
 | |
|     object oLastPerceived = GetLastPerceived();
 | |
|     if(AI_DEBUG)
 | |
|     {
 | |
|         if(GetLastPerceptionHeard ())
 | |
|         {
 | |
|             ai_Debug("nw_ch_ac2", "21", GetName(oCreature) + " heard " +
 | |
|                      GetName(GetLastPerceived()) + " Distance: " +
 | |
|                      FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) +
 | |
|                      " Seen: " + IntToString(GetObjectSeen(oLastPerceived, oCreature)) + ".");
 | |
|         }
 | |
|         if(GetLastPerceptionSeen ())
 | |
|         {
 | |
|             ai_Debug("nw_ch_ac2", "29", GetName(oCreature) + " sees " +
 | |
|                      GetName(GetLastPerceived()) + " Distance: " +
 | |
|                      FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + ".");
 | |
|         }
 | |
|         if(GetLastPerceptionVanished ())
 | |
|         {
 | |
|             ai_Debug("nw_ch_ac2", "35", GetName(oCreature) + " lost sight of " +
 | |
|                      GetName(GetLastPerceived()) + ".");
 | |
|         }
 | |
|     }
 | |
|     // We do nothing on Inaudibles so drop out early!
 | |
|     if(GetLastPerceptionInaudible())
 | |
|     {
 | |
|         ai_Debug("nw_ch_ac2", "42", GetName(oCreature) + " lost sound of " +
 | |
|                  GetName(GetLastPerceived()) + ".");
 | |
|         return;
 | |
|     }
 | |
|     if(AI_DEBUG) ai_Debug("nw_ch_ac2", "46", "Dead? " + IntToString(GetIsDead(oLastPerceived)) +
 | |
|                  " Enemy? " + IntToString(GetIsEnemy(oLastPerceived, oCreature)));
 | |
|     if(ai_Disabled(oCreature)) return;
 | |
|     if(GetIsDead(oLastPerceived) || !GetIsEnemy(oLastPerceived, oCreature)) return;
 | |
|     // All code below assumes the perceived creature is an enemy and is alive!
 | |
|     // **************************** ENEMY HEARD ********************************
 | |
|     if(GetLastPerceptionHeard())
 | |
|     {
 | |
|         // Since Heard is run before Seen, but the values are set at the same
 | |
|         // time we can skip heard checks on heard & seen creatures!
 | |
|         if(GetObjectSeen(oLastPerceived, oCreature))
 | |
|         {
 | |
|             // If the creature we are perceiving was our invisible creature then
 | |
|             // remove that they are invisible.
 | |
|             if(oLastPerceived == GetLocalObject(oCreature, AI_IS_INVISIBLE))
 | |
|             {
 | |
|                 DeleteLocalObject(oCreature, AI_IS_INVISIBLE);
 | |
|             }
 | |
|             ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_SEE_AN_ENEMY);
 | |
|         }
 | |
|         else ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_HEARD_AN_ENEMY);
 | |
|         return;
 | |
|     }
 | |
|     // **************************** ENEMY SEEN *********************************
 | |
|     if(GetLastPerceptionSeen())
 | |
|     {
 | |
|         // If the creature we are perceiving was our invisible creature then
 | |
|         // remove that they are invisible.
 | |
|         if(oLastPerceived == GetLocalObject(oCreature, AI_IS_INVISIBLE))
 | |
|         {
 | |
|             DeleteLocalObject(oCreature, AI_IS_INVISIBLE);
 | |
|         }
 | |
|         ai_AssociateEvaluateNewThreat(oCreature, oLastPerceived, AI_I_SEE_AN_ENEMY);
 | |
|         return;
 | |
|     }
 | |
|     // **************************** ENEMY VANISHED *****************************
 | |
|     if(GetLastPerceptionVanished())
 | |
|     {
 | |
|         // Lets keep a mental note of the invisible creature.
 | |
|         SetLocalObject(oCreature, AI_IS_INVISIBLE, oLastPerceived);
 | |
|         if(AI_DEBUG) ai_Debug("nw_ch_ac2", "86", " We saw " + GetName(oLastPerceived) + " disappear!");
 | |
|         if(ai_GetIsBusy(oCreature)) return;
 | |
|         // If in combat check to see if our target disappeared.
 | |
|         // If they have and we are not in melee with them then reevaluate combat
 | |
|         // since we lost our target.
 | |
|         if(ai_GetIsInCombat(oCreature))
 | |
|         {
 | |
|             if(AI_DEBUG) ai_Debug("nw_ch_ac2", "93", "Is this our target? " +
 | |
|                          IntToString(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived));
 | |
|             if(ai_GetAttackedTarget(oCreature, TRUE, TRUE) == oLastPerceived)
 | |
|             {
 | |
|                 ai_DoAssociateCombatRound(oCreature);
 | |
|             }
 | |
|             return;
 | |
|         }
 | |
|         // If they are not invisible then that means they left our perception
 | |
|         // range and we need follow them.
 | |
|         if(ai_CanIAttack(oCreature)) ActionMoveToObject(oLastPerceived, TRUE, AI_RANGE_CLOSE);
 | |
|     }
 | |
|     // **************************** ENEMY INAUDIBLE*****************************
 | |
|     // Not used.
 | |
| }
 |