Fixed CCOH, Fixed starting GP, Fixed DMFI languages, Fix cep weapon appearances, Fixed new player start up system. Added PC deleter. Added ACP 4.1. Full compile. Updated release archive.
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));
|
|
}
|
|
}
|