//:://////////////////////////////////////////////////
//:: X0_CH_HEN_CONV
/*

  OnDialogue event handler for henchmen/associates.

  This is used by the Cohorts for the PRC to trigger a
  generic henchman conversation

 */
//:://////////////////////////////////////////////////
//:: Copyright (c) 2002 Floodgate Entertainment
//:: Created By: Naomi Novik
//:: Created On: 01/05/2003
//:://////////////////////////////////////////////////


#include "prc_alterations"
#include "inc_dynconv"
#include "x0_inc_henai"
#include "x0_i0_henchman"

//* GeorgZ - Put in a fix for henchmen talking even if they are petrified
int AbleToTalk(object oSelf)
{
   if (PRCGetHasEffect(EFFECT_TYPE_CONFUSED, oSelf) || PRCGetHasEffect(EFFECT_TYPE_DOMINATED, oSelf) ||
        PRCGetHasEffect(EFFECT_TYPE_PETRIFY, oSelf) || PRCGetHasEffect(EFFECT_TYPE_PARALYZE, oSelf)   ||
        PRCGetHasEffect(EFFECT_TYPE_STUNNED, oSelf) || PRCGetHasEffect(EFFECT_TYPE_FRIGHTENED, oSelf)
    )
    {
        return FALSE;
    }

   return TRUE;
}

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();

//    int i = GetLocalInt(OBJECT_SELF, sAssociateMasterConditionVarname);
//    SendMessageToPC(GetFirstPC(), IntToHexString(i));
    if (GetIsHenchmanDying() == TRUE)
    {
        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);

//PRC CHANGE
            //BeginConversation("prc_cohort");
            //use a dynamic conversation instead

            // Make sure we're not already inside the dynconvo
            if(!GetLocalInt(OBJECT_SELF, "PRC_InCohortConvoMarker"))
            {
                SetLocalInt(OBJECT_SELF, "PRC_InCohortConvoMarker", TRUE);
                StartDynamicConversation("prc_cohort_convo", oShouter, DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, TRUE, FALSE, OBJECT_SELF);
            }
//PRC CHANGE
        }
    }
    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);
            }
        }

        // 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();
                     }
                 }
             }

             // Actually respond to the shout
             RespondToShout(oShouter, nMatch, oIntruder);
         }
    }


    // Signal user-defined event
    if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT)) {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DIALOGUE));
    }
}
