/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#ifndef CRYINCLUDE_CRYCOMMON_IAIACTION_H
#define CRYINCLUDE_CRYCOMMON_IAIACTION_H
#pragma once
struct IGoalPipe;
///////////////////////////////////////////////////
// IAIAction references an Action Flow Graph -
// ordered sequence of elementary actions which
// will be executed to "use" a smart object
///////////////////////////////////////////////////
struct IAIAction
{
    /// Event names used to inform listeners of an action when the action's state changes
    enum EActionEvent
    {
        ActionEnd = 0,
        ActionStart,
        ActionCancel,
        ActionAbort,
    };
    struct IAIActionListener
    {
        // 
        virtual ~IAIActionListener(){}
        virtual void OnActionEvent(EActionEvent event) = 0;
        // 
    };
    // 
    virtual ~IAIAction(){}
    // returns the unique name of this AI Action
    virtual const char* GetName() const = 0;
    // returns the goal pipe which executes this AI Action
    virtual IGoalPipe* GetGoalPipe() const = 0;
    // returns the User entity associated to this AI Action
    virtual IEntity* GetUserEntity() const = 0;
    // returns the Object entity associated to this AI Action
    virtual IEntity* GetObjectEntity() const = 0;
    // returns true if action is active and marked as high priority
    virtual bool IsHighPriority() const { return false; }
    // ends execution of this AI Action
    virtual void EndAction() = 0;
    // cancels execution of this AI Action
    virtual void CancelAction() = 0;
    // aborts execution of this AI Action - will start clean up procedure
    virtual bool AbortAction() = 0;
    // marks this AI Action as modified
    virtual void Invalidate() = 0;
    virtual bool IsSignaledAnimation() const = 0;
    virtual bool IsExactPositioning() const = 0;
    virtual const char* GetAnimationName() const = 0;
    virtual const Vec3& GetAnimationPos() const = 0;
    virtual const Vec3& GetAnimationDir() const = 0;
    virtual bool IsUsingAutoAssetAlignment() const = 0;
    virtual const Vec3& GetApproachPos() const = 0;
    virtual float GetStartWidth() const = 0;
    virtual float GetStartArcAngle() const = 0;
    virtual float GetDirectionTolerance() const = 0;
    virtual void RegisterListener(IAIActionListener* eventListener, const char* name) = 0;
    virtual void UnregisterListener(IAIActionListener* eventListener) = 0;
    // 
};
#endif // CRYINCLUDE_CRYCOMMON_IAIACTION_H