#pragma once
#include "Entity.h"
//自动分配状态ID
int GetNextEntityStateID();
//状态抽象类
class EntityState
{
public:
    void Init(std::weak_ptr<Entity> e);
    virtual bool GetEnable();
    virtual void SetEnable(bool bEnable);
    void Step();
    PlayerUIData* GetUI();//取UI
    virtual void Reset();
    virtual void State();
    virtual void SetPhysice(bool bInWater);//设置地面物理或水中物理
    virtual void ChangeStateMsg(int stateID);//当设置状态时，所有的状态模块都会收到消息
    virtual void SubInit(std::weak_ptr<Entity> e);//传给子状态的初始化
    virtual void SubStep();
    virtual int GetStateID();
    //捕获的受伤函数
    virtual bool Hurt(std::weak_ptr<Entity> src, int* pGetDamage, float* pAngle, bool* pTakedown, int* pElemType,
        float* pShockForce, float* pHeavy, int* outRealDamage, bool* outRetVal);
    virtual bool BeginCaught(std::weak_ptr<Entity> src, std::weak_ptr<Entity>& ret);//开始被某单位抓取

protected:
    std::weak_ptr<Entity> e;
    bool enable = false;
    int stateID = -1;
};

//技能状态抽象类
class EntitySkillState :
    public EntityState
{
public:
    bool lock = true;//技能是否未解锁
    int mp_cost = 0;
    int cd_counter = 0;
    int cd_counter_max = 30;
    int ui_index = -1;
    int iconIndex = -1;//技能图标下标
    DWORD keyMask = 0;//该技能绑定到的按键
    bool disableBind = false;//该技能不需要技能按键绑定
    bool bUIShowDisableSkill = false;
    void SubStep() override;
    virtual const wchar_t* GetSaveName();//技能的存档名
    virtual const wchar_t* GetFuncName();//取物品栏中的函数名
    virtual const wchar_t* GetCheckFuncName();//取物品栏中的调查函数名
};
