Added PEPS AI. Updated module name. Set all henchmen to have a random race &/or class based name using a custom version of Markshire's Nomeclature scripts, as well as appearance. Set Constructs, Undead, Outsiders & Elementals to not require food or drink. Full compile.
108 lines
5.0 KiB
Plaintext
108 lines
5.0 KiB
Plaintext
/*//////////////////////////////////////////////////////////////////////////////
|
|
Script: xx_pc_2_percept
|
|
Programmer: Philos
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
Player OnPerception script for PC AI;
|
|
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("xx_pc_2_percept", "22", GetName(oCreature) + " heard " +
|
|
GetName(GetLastPerceived()) + " Distance: " +
|
|
FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) +
|
|
" Seen: " + IntToString(GetObjectSeen(oLastPerceived, oCreature)) + ".");
|
|
}
|
|
if(GetLastPerceptionSeen ())
|
|
{
|
|
ai_Debug("xx_pc_2_percept", "29", GetName(oCreature) + " sees " +
|
|
GetName(GetLastPerceived()) + " Distance: " +
|
|
FloatToString(GetDistanceBetween(GetLastPerceived(), oCreature), 0, 2) + ".");
|
|
}
|
|
if(GetLastPerceptionVanished ())
|
|
{
|
|
ai_Debug("xx_pc_2_percept", "35", GetName(oCreature) + " lost sight of " +
|
|
GetName(GetLastPerceived()) + ".");
|
|
}
|
|
}
|
|
// We do nothing on Inaudibles so drop out early!
|
|
if(GetLastPerceptionInaudible())
|
|
{
|
|
ai_Debug("xx_pc_2_percept", "42", GetName(oCreature) + " lost sound of " +
|
|
GetName(GetLastPerceived()) + ".");
|
|
return;
|
|
}
|
|
if(AI_DEBUG) ai_Debug("xx_pc_2_percept", "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("xx_pc_2_percept", "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("xx_pc_2_percept", "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.
|
|
ActionMoveToObject(oLastPerceived, TRUE, AI_RANGE_CLOSE);
|
|
}
|
|
// **************************** ENEMY INAUDIBLE*****************************
|
|
// Not used.
|
|
}
|