2025/07/18 Update
Added PEPS. Full compile.
This commit is contained in:
107
_module/nss/xx_pc_2_percept.nss
Normal file
107
_module/nss/xx_pc_2_percept.nss
Normal file
@@ -0,0 +1,107 @@
|
||||
/*//////////////////////////////////////////////////////////////////////////////
|
||||
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.
|
||||
}
|
Reference in New Issue
Block a user