/*:://////////////////////////////////////////////
//:: Name Summon Monster - On Conversation
//:: FileName SMP_AI_Summ_Conv
//:://////////////////////////////////////////////
    On Conversation.

    It will react to shouts sent to it, including Bioware's associate shouts
    for hold ground and so on.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/

#include "PHS_AI_INCLUDE"

void main()
{
    // Get who spoke
    object oSelf = OBJECT_SELF;
    object oSpeaker = GetLastSpeaker();
    object oMaster = GetMaster();
    object oTarget;
    int nConversation = GetListenPatternNumber();

    // Cannot not be the master
    if(oSpeaker != oMaster) return;

    // Check nConversation's number.
    switch(nConversation)
    {
        // If -1, it is a converastion thing
        case -1:
        {
            if(GetCommandable() == TRUE)
            {
                // Start the conversation
                BeginConversation();
            }
        }
        break;
        // Other things (not -1)

        // * toggle search mode for henchmen
        case ASSOCIATE_COMMAND_TOGGLESEARCH:
        {
            if(GetActionMode(OBJECT_SELF, ACTION_MODE_DETECT) == TRUE)
            {
                SetActionMode(OBJECT_SELF, ACTION_MODE_DETECT, FALSE);
            }
            else
            {
                SetActionMode(OBJECT_SELF, ACTION_MODE_DETECT, TRUE);
            }
        }
        break;
        // * toggle stealth mode for henchmen
        case ASSOCIATE_COMMAND_TOGGLESTEALTH:
        {
            if(GetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH) == TRUE)
            {
                SetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH, FALSE);
            }
            else
            {
                SetActionMode(OBJECT_SELF, ACTION_MODE_STEALTH, TRUE);
            }
        }
        break;
        // * Stop spellcasting
        case ASSOCIATE_COMMAND_TOGGLECASTING:
        {
            // Use spawn conditions
            if(SMPAI_GetSummonSetting(SMPAI_SUMMON_CAN_USE_SPELLS))
            {
                SMPAI_SetSummonSetting(SMPAI_SUMMON_CAN_USE_SPELLS, FALSE);
            }
            else
            {
                SMPAI_SetSummonSetting(SMPAI_SUMMON_CAN_USE_SPELLS);
            }
        }
        break;
        // Open inventory
        case ASSOCIATE_COMMAND_INVENTORY:
        {
            // Don't open for summons.
            FloatingTextStringOnCreature("Summon's inventory cannot be edited", oMaster, FALSE);
            return;
        }
        break;
        // Pick the nearest lock or bash it.
        case ASSOCIATE_COMMAND_PICKLOCK:
        {
            // Call function "Pick Lock" with the nearest locked door.
            //oTarget =

        }
        break;
        // Disarm any traps.
        case ASSOCIATE_COMMAND_DISARMTRAP: // Disarm trap
        {
            // Call function "Disarm trap" with no target
            oTarget = GetNearestTrapToObject(oSelf, TRUE);


        }
        break;
        // Attack the nearest enemy - force combat!
        case ASSOCIATE_COMMAND_ATTACKNEAREST:
        {
            // Attack our masters target if they are valid.
            oTarget = GetAttackTarget(oMaster);
            if(GetIsObjectValid(oTarget) == TRUE)
            {
                if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE ||
                   GetObjectType(oTarget) == OBJECT_TYPE_DOOR)
                {
                    ActionAttack(oTarget);
                    return;
                }
            }
            // Else normal attack (even if oTarget is invalid, it'll use the nearest).
            SMPAI_SummonAttack(oTarget);
        }
        break;
        // Just move to the master
        case ASSOCIATE_COMMAND_FOLLOWMASTER:
        {
            ClearAllActions();
            ActionForceFollowObject(oMaster, 2.0);
        }
        break;
        // Attack the masters last attacker
        case ASSOCIATE_COMMAND_GUARDMASTER:
        {
            oTarget = GetLastHostileActor(oMaster);
            if(!GetIsObjectValid(oTarget))
            {
                oTarget = GetAttackTarget(oMaster);
            }
            SMPAI_SummonAttack(oTarget);
        }
        break;
        // Heal our master
        case ASSOCIATE_COMMAND_HEALMASTER:
        {
            // Heal the master! Well, only if we can...
        }
        break;
        // Will not guard master or follow.
        case ASSOCIATE_COMMAND_STANDGROUND:
        {

        }
        break;
        // Next ones are all done by the game engine!
        //  Master failed to pick a lock. We can't get what lock was failed, so
        //  get nearest locked object to the.
        case ASSOCIATE_COMMAND_MASTERFAILEDLOCKPICK:
        {

        }
        break;
        // Master saw a trap
        //  We can get the trap via. GetLastTrapDetected(oMaster).
        case ASSOCIATE_COMMAND_MASTERSAWTRAP:
        {
            if(!GetIsInCombat())
            {
            //    if(!GetAssociateState(NW_ASC_MODE_STAND_GROUND))
            //    {
                    oTarget = GetLastTrapDetected(oMaster);
            //    }
            }
        }
        break;
        // Master under attack
        //  We can get the last attacker with GetLastHostileActor().
        case ASSOCIATE_COMMAND_MASTERUNDERATTACK:
        {
            // Start combat if not already in combat
            oTarget = GetLastHostileActor(oMaster);
            if(!GetIsInCombat())
            {
                SMPAI_SummonAttack(oTarget);
            }
        }
        break;
        // Master has attacked someone - we should go into combat.
        //  We can get their target using GetAttackTarget().
        case ASSOCIATE_COMMAND_MASTERATTACKEDOTHER:
        {
            // Get the target
            oTarget = GetAttackTarget(oMaster);


        }
        break;
        // Master is going to be attacked.
        //  We can get who they will be attacked by with GetGoingToBeAttackedBy().
        //  Not sure when this is fired.
        case ASSOCIATE_COMMAND_MASTERGOINGTOBEATTACKED:
        {
            //if(!GetAssociateState(NW_ASC_MODE_STAND_GROUND))
            //{
                if(!GetIsInCombat(OBJECT_SELF))
                {
                    oTarget = GetGoingToBeAttackedBy(oMaster);
                    // April 2003: If my master can see the enemy, then I can too.
                    // Potential Side effect : Henchmen may run
                    // to stupid places, trying to get an enemy
                    if(GetIsObjectValid(oTarget) && GetObjectSeen(oTarget, oMaster))
                    {
                        ClearAllActions();
                        ActionMoveToObject(oTarget, TRUE, 7.0);
                        SMPAI_SummonAttack(oTarget);
                    }
                }
            //}
        }
        break;
        // We should leave the party.
        //  Summons become "unsummoned" and destroy themselves.
        case ASSOCIATE_COMMAND_LEAVEPARTY:
        {
            // Destroy self with nice effect
            // Do nothing for now (might change later, or it might be internal)
            // SMPAI_UnsummonSelf();
            return;
        }
        break;
        // End
    }
}