#ifndef D_A_NPC_BTSW2_H
#define D_A_NPC_BTSW2_H

#include "f_op/f_op_actor.h"
#include "d/d_npc.h"

class daNpc_Btsw2_c : public fopNpc_npc_c {
public:
    typedef BOOL (daNpc_Btsw2_c::*ActionFunc)(void*);

    enum ActionStatus {
        ACTION_STARTING = 0,
        ACTION_ONGOING  = 1,
        ACTION_ENDING   = -1,
    };

    cXyz& getAttentionBasePos() { return mAttPos; }
    void setAction(ActionFunc func, void* arg) {
        if (mCurrActionFunc != func) {
            if (mCurrActionFunc) {
                mActionStatus = ACTION_ENDING;
                (this->*mCurrActionFunc)(arg);
            }
            mCurrActionFunc = func;
            mActionStatus = ACTION_STARTING;
            (this->*mCurrActionFunc)(arg);
        }
    }

    BOOL initTexPatternAnm(bool);
    void playTexPatternAnm();
    void setAnm(s8);
    bool chkAttention(cXyz, s16);
    void eventOrder();
    void checkOrder();
    virtual void anmAtr(u16);
    virtual u32 getMsg();
    virtual u16 next_msgStatus(u32*);
    void setAttention();
    void lookBack();
    BOOL CreateHeap();
    BOOL CreateInit();
    void wait01();
    void talk01();
    void pathMove();
    BOOL wait_action(void*);
    cPhs_State _create();
    BOOL _delete();
    BOOL _execute();
    BOOL _draw();

    static const char m_arc_name[];

private:
    /* 0x6C4 */ request_of_phase_process_class mPhs;
    /* 0x6CC */ u32 mShadowId;
    /* 0x6D0 */ J3DModel* mpKabanModel; // Bag
    /* 0x6D4 */ J3DModel* mpTirasiModel; // Flyer
    /* 0x6D8 */ J3DAnmTexPattern* m_btp;
    /* 0x6DC */ mDoExt_btpAnm mBtpAnm;
    /* 0x6F0 */ u8 mBtpFrame;
    /* 0x6F1 */ s8 m_handL_jnt_num;
    /* 0x6F2 */ s8 m_handR_jnt_num;
    /* 0x6F4 */ s16 mBlinkTimer;
    /* 0x6F6 */ u8 m6F6[0x704 - 0x6F6];
    /* 0x704 */ cXyz mAttPos;
    /* 0x710 */ u8 m710[0x714 - 0x710];
    /* 0x714 */ csXyz m714;
    /* 0x71A */ u8 m71A[0x71D - 0x71A];
    /* 0x71D */ bool mHasAttention;
    /* 0x71E */ bool m71E;
    /* 0x71F */ u8 m71F[0x724 - 0x71F];
    /* 0x724 */ u8 m724;
    /* 0x728 */ ActionFunc mCurrActionFunc;
    /* 0x734 */ s8 mPathNo;
    /* 0x735 */ u8 m735;
    /* 0x736 */ u8 m736;
    /* 0x738 */ dPath* mpPath;
    /* 0x73C */ s16 mFinalPathPntIdx;
    /* 0x73E */ s16 m73E;
    /* 0x740 */ s16 mPathPntIdx;
    /* 0x742 */ s16 m742;
    /* 0x744 */ s8 m744;
    /* 0x745 */ s8 m745;
    /* 0x746 */ s8 m746;
    /* 0x747 */ s8 m747;
    /* 0x748 */ u8 m748[0x74A - 0x748];
    /* 0x74A */ s8 mActionStatus;
};

#endif /* D_A_NPC_BTSW2_H */
