NWNDS/nwnds_module/hench_i0_act.nss
Jaysyn904 de24f81734 Added NWN Dark Sun module contents
Added NWN Dark Sun module contents.
2021-07-12 21:24:46 -04:00

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;
}