158 lines
4.4 KiB
Plaintext
158 lines
4.4 KiB
Plaintext
/*
|
|
|
|
Henchman Inventory And Battle AI
|
|
|
|
This file contains functions used in the default On* scripts
|
|
for henchman actions during noncombat. This includes dealing
|
|
with traps, locks, items, and containers
|
|
|
|
*/
|
|
|
|
#include "hench_i0_generic"
|
|
|
|
// void main() { }
|
|
|
|
// Removes master force trap and locks
|
|
void ClearForceOptions();
|
|
|
|
// force associate to open given lock
|
|
void OpenLock(object oLock);
|
|
|
|
// force associate to disarm given trap
|
|
void ForceTrap(object oTrap);
|
|
|
|
// true if free to work with trap, locks, items
|
|
int GetIAmNotDoingAnything();
|
|
|
|
// checks if associate should do any actions with
|
|
// traps, locks, or items
|
|
int HenchCheckArea(int nClearActions = FALSE);
|
|
|
|
// finds nears trap or locked item
|
|
object HenchGetLockedOrTrappedObject(object oMaster);
|
|
|
|
|
|
// strings for actions
|
|
const string sLockMasterFailed = "tk_master_lock_failed";
|
|
const string sForceTrap = "tk_force_trap";
|
|
|
|
|
|
void ClearForceOptions()
|
|
{
|
|
DeleteLocalObject(OBJECT_SELF, sLockMasterFailed);
|
|
DeleteLocalInt(OBJECT_SELF, sForceTrap);
|
|
}
|
|
|
|
|
|
void OpenLock(object oLock)
|
|
{
|
|
if (GetIsObjectValid(oLock))
|
|
{
|
|
SetLocalObject(OBJECT_SELF, sLockMasterFailed, oLock);
|
|
ExecuteScript("hench_o0_act", OBJECT_SELF);
|
|
}
|
|
}
|
|
|
|
|
|
void ForceTrap(object oTrap)
|
|
{
|
|
if (GetIsObjectValid(oTrap))
|
|
{
|
|
SetLocalObject(OBJECT_SELF, sLockMasterFailed, oTrap);
|
|
SetLocalInt(OBJECT_SELF, sForceTrap, TRUE);
|
|
ExecuteScript("hench_o0_act", OBJECT_SELF);
|
|
}
|
|
}
|
|
|
|
|
|
int GetIAmNotDoingAnything()
|
|
{
|
|
int currentAction = GetCurrentAction(OBJECT_SELF);
|
|
|
|
return !IsInConversation(OBJECT_SELF)
|
|
&& !GetIsObjectValid(GetAttemptedAttackTarget())
|
|
&& !GetIsObjectValid(GetAttemptedSpellTarget())
|
|
&& currentAction != ACTION_REST
|
|
&& currentAction != ACTION_DISABLETRAP
|
|
&& currentAction != ACTION_OPENLOCK
|
|
&& currentAction != ACTION_USEOBJECT
|
|
&& currentAction != ACTION_RECOVERTRAP
|
|
&& currentAction != ACTION_EXAMINETRAP
|
|
&& currentAction != ACTION_PICKUPITEM
|
|
&& currentAction != ACTION_HEAL
|
|
&& currentAction != ACTION_TAUNT;
|
|
}
|
|
|
|
|
|
int HenchCheckArea(int nClearActions = FALSE)
|
|
{
|
|
// only execute if we have something to do
|
|
if (!GetAssociateState(NW_ASC_MODE_STAND_GROUND) && !GetLocalInt(OBJECT_SELF, sHenchDontAttackFlag) &&
|
|
GetIAmNotDoingAnything() &&
|
|
((GetHasSkill(SKILL_DISABLE_TRAP) && !GetLocalInt(OBJECT_SELF, sHenchNoDisarmTraps)) ||
|
|
GetLocalInt(OBJECT_SELF, sHenchAutoOpenLocks) ||
|
|
GetLocalInt(OBJECT_SELF, sHenchAutoPickup) || GetLocalInt(OBJECT_SELF, sHenchAutoOpenChest) ||
|
|
GetIsObjectValid(GetLocalObject(OBJECT_SELF, sLockMasterFailed))))
|
|
{
|
|
if (!GetLocalInt(OBJECT_SELF, "tk_doing_action"))
|
|
{
|
|
ExecuteScript("hench_o0_act", OBJECT_SELF);
|
|
return GetLocalInt(OBJECT_SELF, "tk_action_result");
|
|
}
|
|
else
|
|
{
|
|
ActionDoCommand(ExecuteScript("hench_o0_act", OBJECT_SELF));
|
|
return TRUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ClearForceOptions();
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: Get Locked or Trapped Object
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Finds the closest locked or trapped object to the object
|
|
passed in up to a maximum of 10 objects.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Pausanias
|
|
//:: Created On: ??????
|
|
//:://////////////////////////////////////////////
|
|
|
|
object HenchGetLockedOrTrappedObject(object oMaster)
|
|
{
|
|
int nCnt = 1;
|
|
int bValid = TRUE;
|
|
object oRealMaster = GetRealMaster();
|
|
object oLastObject = GetNearestObjectToLocation(OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE | OBJECT_TYPE_TRIGGER, GetLocation(oMaster), nCnt);
|
|
while (GetIsObjectValid(oLastObject) && bValid)
|
|
{
|
|
//COMMENT THIS BACK IN WHEN DOOR ACTION WORKS ON PLACABLE.
|
|
|
|
//object oItem = GetFirstItemInInventory(oLastObject);
|
|
if(GetLocked(oLastObject) ||
|
|
(GetIsTrapped(oLastObject) &&
|
|
(GetTrapDetectedBy(oLastObject,OBJECT_SELF) ||
|
|
GetTrapDetectedBy(oLastObject,oRealMaster))))
|
|
{
|
|
return oLastObject;
|
|
}
|
|
nCnt++;
|
|
if(nCnt == 10)
|
|
{
|
|
bValid = FALSE;
|
|
}
|
|
oLastObject = GetNearestObjectToLocation(OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE | OBJECT_TYPE_TRIGGER, GetLocation(oMaster), nCnt);
|
|
}
|
|
return OBJECT_INVALID;
|
|
}
|
|
|
|
|