2025/07/20 Update
Updated PEPS AI.
This commit is contained in:
@@ -1,20 +1,14 @@
|
||||
//:://////////////////////////////////////////////////
|
||||
//:: X0_CH_HEN_CONV
|
||||
/*
|
||||
|
||||
OnDialogue event handler for henchmen/associates.
|
||||
|
||||
*/
|
||||
// OnDialogue event handler for henchmen/associates.
|
||||
//:://////////////////////////////////////////////////
|
||||
//:: Copyright (c) 2002 Floodgate Entertainment
|
||||
//:: Created By: Naomi Novik
|
||||
//:: Created On: 01/05/2003
|
||||
//:://////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include "x0_inc_henai"
|
||||
#include "x0_i0_henchman"
|
||||
|
||||
#include "0i_associates"
|
||||
//* GeorgZ - Put in a fix for henchmen talking even if they are petrified
|
||||
int AbleToTalk(object oSelf)
|
||||
{
|
||||
@@ -28,108 +22,70 @@ int AbleToTalk(object oSelf)
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
#include "x0_i0_henchman"
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
// * XP2, special handling code for interjections
|
||||
// * This script only fires if someone inits with me.
|
||||
// * with that in mind, I am now clearing any interjections
|
||||
// * that the character might have on themselves.
|
||||
if (GetLocalInt(GetModule(), "X2_L_XP2") == TRUE)
|
||||
{
|
||||
SetLocalInt(OBJECT_SELF, "X2_BANTER_TRY", 0);
|
||||
SetHasInterjection(GetMaster(OBJECT_SELF), FALSE);
|
||||
SetLocalInt(OBJECT_SELF, "X0_L_BUSY_SPEAKING_ONE_LINER", 0);
|
||||
SetOneLiner(FALSE, 0);
|
||||
}
|
||||
|
||||
object oShouter = GetLastSpeaker();
|
||||
if (GetTag(OBJECT_SELF) == "x0_hen_dee")
|
||||
object oCreature = OBJECT_SELF;
|
||||
// * XP2, special handling code for interjections
|
||||
// * This script only fires if someone inits with me.
|
||||
// * with that in mind, I am now clearing any interjections
|
||||
// * that the character might have on themselves.
|
||||
if (GetLocalInt(GetModule(), "X2_L_XP2") == TRUE)
|
||||
{
|
||||
string sCall = GetCampaignString("Deekin", "q6_Deekin_Call"+ GetName(oShouter), oShouter);
|
||||
|
||||
if (sCall == "")
|
||||
{
|
||||
SetCustomToken(1001, GetStringByStrRef(40570));
|
||||
}
|
||||
SetLocalInt(oCreature, "X2_BANTER_TRY", 0);
|
||||
SetHasInterjection(GetMaster(oCreature), FALSE);
|
||||
SetLocalInt(oCreature, "X0_L_BUSY_SPEAKING_ONE_LINER", 0);
|
||||
SetOneLiner(FALSE, 0);
|
||||
}
|
||||
object oLastSpeaker = GetLastSpeaker();
|
||||
if (GetTag(oCreature) == "x0_hen_dee")
|
||||
{
|
||||
string sCall = GetCampaignString("Deekin", "q6_Deekin_Call"+ GetName(oLastSpeaker), oLastSpeaker);
|
||||
if (sCall == "") SetCustomToken(1001, GetStringByStrRef(40570));
|
||||
else SetCustomToken(1001, sCall);
|
||||
}
|
||||
|
||||
// int i = GetLocalInt(OBJECT_SELF, sAssociateMasterConditionVarname);
|
||||
// SendMessageToPC(GetFirstPC(), IntToHexString(i));
|
||||
if (GetIsHenchmanDying() == TRUE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// If we are disabled then we can't listen or talk, Busy is checked in ai_SelectAssociateCommand().
|
||||
if (GetIsHenchmanDying(oCreature) || ai_Disabled(oCreature)) return;
|
||||
object oMaster = GetMaster();
|
||||
int nMatch = GetListenPatternNumber();
|
||||
|
||||
object oIntruder;
|
||||
|
||||
if (nMatch == -1)
|
||||
{
|
||||
// * September 2 2003
|
||||
// * Added the GetIsCommandable check back in so that
|
||||
// * Henchman cannot be interrupted when they are walking away
|
||||
if (GetCommandable(OBJECT_SELF) == TRUE && AbleToTalk(OBJECT_SELF)
|
||||
&& (GetCurrentAction() != ACTION_OPENLOCK))
|
||||
{ //SetCommandable(TRUE);
|
||||
//ClearActions(CLEAR_X0_CH_HEN_CONV_26);
|
||||
|
||||
|
||||
BeginConversation("hench_base", GetLastSpeaker());
|
||||
|
||||
if (!ai_GetIsBusy(oCreature))
|
||||
{
|
||||
ai_ClearCreatureActions();
|
||||
string sDialogFileToUse = GetDialogFileToUse(GetLastSpeaker());
|
||||
BeginConversation(sDialogFileToUse);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// listening pattern matched
|
||||
if (GetIsObjectValid(oMaster))
|
||||
{
|
||||
// we have a master, only listen to them
|
||||
// * Nov 2003 - Added an AbleToTalk, so that henchmen
|
||||
// * do not respond to orders when 'frozen'
|
||||
if (GetIsObjectValid(oShouter) && oMaster == oShouter && AbleToTalk(OBJECT_SELF)) {
|
||||
SetCommandable(TRUE);
|
||||
bkRespondToHenchmenShout(oShouter, nMatch, oIntruder);
|
||||
}
|
||||
}
|
||||
|
||||
if (GetIsObjectValid(oMaster)) ai_SelectAssociateCommand(oCreature, oLastSpeaker, nMatch);
|
||||
// we don't have a master, behave in default way
|
||||
else if (GetIsObjectValid(oShouter)
|
||||
&& !GetIsPC(oShouter)
|
||||
&& GetIsFriend(oShouter)) {
|
||||
|
||||
object oIntruder = OBJECT_INVALID;
|
||||
|
||||
// Determine the intruder if any
|
||||
if(nMatch == 4) {
|
||||
oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER");
|
||||
}
|
||||
else if (nMatch == 5) {
|
||||
oIntruder = GetLastHostileActor(oShouter);
|
||||
if(!GetIsObjectValid(oIntruder)) {
|
||||
oIntruder = GetAttemptedAttackTarget();
|
||||
if(!GetIsObjectValid(oIntruder)) {
|
||||
oIntruder = GetAttemptedSpellTarget();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if (GetIsObjectValid(oLastSpeaker) &&
|
||||
!GetIsPC(oLastSpeaker) &&
|
||||
GetIsFriend(oLastSpeaker))
|
||||
{
|
||||
object oIntruder = OBJECT_INVALID;
|
||||
// Determine the intruder if any
|
||||
if(nMatch == 4) oIntruder = GetLocalObject(oLastSpeaker, "NW_BLOCKER_INTRUDER");
|
||||
else if (nMatch == 5)
|
||||
{
|
||||
oIntruder = GetLastHostileActor(oLastSpeaker);
|
||||
if(!GetIsObjectValid(oIntruder))
|
||||
{
|
||||
oIntruder = GetAttemptedAttackTarget();
|
||||
if(!GetIsObjectValid(oIntruder)) oIntruder = GetAttemptedSpellTarget();
|
||||
}
|
||||
}
|
||||
// Actually respond to the shout
|
||||
RespondToShout(oShouter, nMatch, oIntruder);
|
||||
RespondToShout(oLastSpeaker, nMatch, oIntruder);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Signal user-defined event
|
||||
if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT)) {
|
||||
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE));
|
||||
if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT))
|
||||
{
|
||||
SignalEvent(oCreature, EventUserDefined(EVENT_DIALOGUE));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user