202 lines
6.8 KiB
Plaintext
202 lines
6.8 KiB
Plaintext
|
//::///////////////////////////////////////////////
|
||
|
//:: 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;
|
||
|
}
|
||
|
|
||
|
|
||
|
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(GetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT))
|
||
|
{
|
||
|
effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);
|
||
|
if(d10() > 6)
|
||
|
{
|
||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if(GetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT))
|
||
|
{
|
||
|
SignalEvent(OBJECT_SELF, EventUserDefined(1001));
|
||
|
}
|
||
|
}
|