2025/07/21 Update

Added PEPS AI.
Full compile.
This commit is contained in:
Jaysyn904
2025-07-21 09:07:09 -04:00
parent 0b53f89e02
commit 9ae0679a70
1359 changed files with 44828 additions and 1039 deletions

View File

@@ -1,201 +1,92 @@
//::///////////////////////////////////////////////
//:: Default On Heartbeat
//:: NW_C2_DEFAULT1
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This script will have people perform default
animations.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Nov 23, 2001
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"
#include "prc_inc_spells"
object GetNearestTougherFriend(object oSelf, object oPC) {
int i = 0;
object oFriend = oSelf;
int nEqual = 0;
int nNear = 0;
while (GetIsObjectValid(oFriend)) {
if (GetDistanceBetween(oSelf,oFriend) < 40.0 && oFriend != oSelf) {
++nNear;
if (GetHitDice(oFriend) > GetHitDice(oSelf))
return oFriend;
if (GetHitDice(oFriend) == GetHitDice(oSelf))
++nEqual;
}
++i;
oFriend = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_FRIEND,
oSelf, i);
}
SetLocalInt(OBJECT_SELF,"LocalBoss",FALSE);
if (nEqual == 0)
if (nNear > 0 || GetHitDice(oPC)-GetHitDice(OBJECT_SELF) < 2) {
SetLocalInt(OBJECT_SELF,"LocalBoss",TRUE);
}
return OBJECT_INVALID;
}
/*//////////////////////////////////////////////////////////////////////////////
Script: nw_c2_default1
Programmer: Philos
////////////////////////////////////////////////////////////////////////////////
Monster OnHeartbeat script;
This will usually fire every 6 seconds (1 game round).
*///////////////////////////////////////////////////////////////////////////////
#include "0i_module"
void main()
{
// * if not runnning normal or better Ai then exit for performance reasons
if (GetAILevel() == AI_LEVEL_VERY_LOW) return;
ExecuteScript("prc_npc_hb", OBJECT_SELF);
// Pausanias: monsters try to find you.
if (GetGameDifficulty() >= GAME_DIFFICULTY_CORE_RULES) {
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC,
OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION,
PERCEPTION_NOT_SEEN);
if (GetIsObjectValid(oPC) &&
GetDistanceToObject(oPC) < 40.0 &&
!GetIsObjectValid(GetLastHostileActor()) &&
!GetIsInCombat() &&
!GetIsFighting(OBJECT_SELF) &&
d10() > 2 &&
GetIsEnemy(oPC)) {
int ScoutMode = GetLocalInt(OBJECT_SELF,"ScoutMode");
if (ScoutMode == 0) {
ScoutMode = d2();
SetLocalInt(OBJECT_SELF,"ScoutMode",ScoutMode);
}
object oTarget = GetNearestTougherFriend(OBJECT_SELF,oPC);
if (!GetLocalInt(OBJECT_SELF,"LocalBoss")) {
ClearAllActions();
object oDoor = GetBlockingDoor();
if (GetIsObjectValid(oDoor)) {
if (GetLocked(oDoor))
ExecuteScript("henchunlock",oDoor);
if (GetIsDoorActionPossible(oDoor,DOOR_ACTION_OPEN) &&
!GetLocked(oDoor) && !GetIsTrapped(oDoor)) {
ActionOpenDoor(oDoor);
SetLocalInt(OBJECT_SELF,"OpenedDoor",TRUE);
return;
}
}
int fDist = 15;
if (!GetIsObjectValid(oTarget) || ScoutMode == 1) {
fDist = 10;
oTarget = oPC;
if (d10() > 5) fDist = 25;
}
location lNew;
if (GetLocalInt(OBJECT_SELF,"OpenedDoor")) {
lNew = GetLocalLocation(OBJECT_SELF,"ScoutZone");
SetLocalInt(OBJECT_SELF,"OpenedDoor",FALSE);
}
else {
vector vLoc = GetPosition(oTarget);
vLoc.x += fDist-IntToFloat(Random(2*fDist+1));
vLoc.y += fDist-IntToFloat(Random(2*fDist+1));
vLoc.z += fDist-IntToFloat(Random(2*fDist+1));
lNew = Location(GetArea(oTarget),vLoc,0.);
SetLocalLocation(OBJECT_SELF,"ScoutZone",lNew);
}
ActionMoveToLocation(lNew);
return;
}
}
}
if(GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY))
{
if(TalentAdvancedBuff(40.0))
{
SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY, FALSE);
return;
}
}
if(GetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING))
{
int nDay = FALSE;
if(GetIsDay() || GetIsDawn())
{
nDay = TRUE;
}
if(GetLocalInt(OBJECT_SELF, "NW_GENERIC_DAY_NIGHT") != nDay)
{
if(nDay == TRUE)
{
SetLocalInt(OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", TRUE);
}
else
{
SetLocalInt(OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", FALSE);
}
WalkWayPoints();
}
}
if(!PRCGetHasEffect(EFFECT_TYPE_SLEEP))
{
if(!GetIsPostOrWalking())
{
if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
{
if(!GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)))
{
if(!GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL) && !IsInConversation(OBJECT_SELF))
{
if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN))
{
PlayMobileAmbientAnimations();
}
else if(GetIsEncounterCreature() &&
!GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)))
{
PlayMobileAmbientAnimations();
}
else if(GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) &&
!GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)))
{
PlayImmobileAmbientAnimations();
}
}
else
{
DetermineSpecialBehavior();
}
}
else
{
//DetermineCombatRound();
}
}
}
}
else
// If not runnning normal or better AI then exit for performance reasons
if (GetAILevel(OBJECT_SELF) == AI_LEVEL_VERY_LOW) return;
object oCreature = OBJECT_SELF;
ExecuteScript("prc_npc_hb", oCreature);
if(AI_DEBUG) ai_Debug("nw_c2_default1", "16", GetName(oCreature) + " Heartbeat." +
" OnSpawn: " + IntToString(GetLocalInt(oCreature, AI_ONSPAWN_EVENT)));
// We run our OnSpawn in the heartbeat so the creator can use the original
// OnSpawn for their own use. If we have to recreate the creature then we
// skip the rest of the heartbeat since this version is being destroyed!
if(ai_OnMonsterSpawn(oCreature)) return;
if(AI_DEBUG) ai_Debug("nw_c2_default1", "16", GetName(oCreature) + " Heartbeat." +
" Searching: " + IntToString(GetLocalInt(oCreature, AI_AM_I_SEARCHING)));
if(ai_GetHasEffectType(oCreature, EFFECT_TYPE_SLEEP))
{
// If we're asleep and this is the result of sleeping
// at night, apply the floating 'z's visual effect
// every so often
if(GetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT))
{
effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);
if(d10() > 6)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oCreature);
}
}
}
// Send the user-defined event signal if specified here so it doesn't get skipped.
if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1001));
SignalEvent(oCreature, EventUserDefined(EVENT_HEARTBEAT));
}
if(ai_GetIsBusy(oCreature) || ai_Disabled(oCreature) ||
GetLocalInt(oCreature, AI_AM_I_SEARCHING)) return;
if(ai_GetIsInCombat(oCreature))
{
if(ai_GetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE))
{
object oTarget = ai_GetNearestEnemy(oCreature, 1, 7, 7, -1, -1, TRUE);
if(GetDistanceBetween(oCreature, oTarget) <= 6.0)
{
if(GetLevelByClass(CLASS_TYPE_DRUID, oTarget) == 0 && GetLevelByClass(CLASS_TYPE_RANGER, oTarget) == 0)
{
SetLocalString(oCreature, AI_COMBAT_SCRIPT, "ai_coward");
ActionMoveAwayFromObject(oTarget, TRUE, AI_RANGE_LONG);
return;
}
}
}
ai_DoMonsterCombatRound(oCreature);
return;
}
if(ai_CheckForCombat(oCreature, TRUE)) return;
// If we have not set up our talents then we need to check to see if we should.
if(!GetLocalInt(oCreature, AI_TALENTS_SET))
{
// We setup our talents when a PC gets withing Battlefield range 40.0 meters.
object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, oCreature, 1, CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);
if(oPC != OBJECT_INVALID && GetDistanceBetween(oCreature, oPC) <= AI_RANGE_BATTLEFIELD)
{
if(AI_DEBUG) ai_Debug("nw_c2_default1", "72", GetName(oCreature) + " is " +
FloatToString(GetDistanceBetween(oCreature, oPC), 0, 2) + " from " + GetName(oPC));
if(AI_DEBUG) ai_Debug("nw_c2_default1", "74", GetName(oCreature) + " is Setting Creature Talents and buffing!");
ai_SetupMonsterBuffTargets(oCreature);
// To save steps and time we set the talents while we buff!
ai_SetCreatureTalents(oCreature, TRUE);
ai_ClearBuffTargets(oCreature, "AI_ALLY_TARGET_");
}
}
if(!IsInConversation (oCreature))
{
if(GetWalkCondition(NW_WALK_FLAG_CONSTANT)) WalkWayPoints();
if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS)) PlayMobileAmbientAnimations_NonAvian();
else if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN)) PlayMobileAmbientAnimations_Avian();
else if(GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS)) PlayImmobileAmbientAnimations();
else if(GetLocalInt(GetModule(), AI_RULE_WANDER) && GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oCreature) > 89)
{
ai_AmbientAnimations();
}
}
if(ai_TryHealing(oCreature, oCreature)) return;
}