/// <summary>
        /// attack procedure
        /// </summary>
        /// <param name="attack"></param>
        private void _attackCombo(bool attack)
        {
#if DEBUG_INFO
            if (!m_Initialized)
            {
                Debug.LogError("Component not initialized < " + this.ToString() + " >");
                return;
            }
#endif

            bool isAttacking = m_Animator.GetBool(/*"pAttack1"*/ HashIDs.Attack1Bool);

            if (attack)
            {
                if (m_Character.isOnGround)
                {
                    if (!m_Attack_combo_started && !isAttacking && !m_AttackStateUnderway)
                    {
                        IGameCharacter npc = m_PrimaryTargetNPC;
#if TESTING_USE_ALL_NPC_ARRAY
                        m_PrimaryTargetNPC = _getPrimaryTarget();
#else
                        m_PrimaryTargetNPC = _getPrimaryTargetInZone();
#endif
                        if (m_PrimaryTargetNPC != npc)
                        {
                            if (npc != null)
                            {
                                npc.attack_end_notify(this, 1);
                            }
                        }
                        m_BreakCombo = false;
                        m_Character.turnTransformToDirection(m_TargetDirection);
                        m_Animator.SetBool(/*"pAttack1"*/ HashIDs.Attack1Bool, true);
                        m_Attack_combo_started = true;
                        if (m_PrimaryTargetNPC != null)
                        {
                            m_InCombat = true;
                            if (enableJumpToTarget)
                            {
                                _jumpToTarget();
                            }
                        }
                    }
                    else
                    {
                        m_BreakCombo = false;
                    }
                }
            }
        }
        /// <summary>
        /// attack procedure
        /// </summary>
        /// <param name="attack"></param>
        /// <param name="direction2cursor"></param>
        private void _attackCombo(bool attack, Vector3 direction2cursor)
        {
#if DEBUG_INFO
            if (!m_Initialized)
            {
                Debug.LogError("Component not initialized < " + this.ToString() + " >");
                return;
            }
#endif

            bool isAttacking = m_TopDownPlayer.animator.GetBool(/*"pAttack1"*/ HashIDs.Attack1Bool);

            if (attack)
            {
                if (m_TopDownPlayer.character.isOnGround)
                {
                    m_TopDownPlayer.stop();

                    m_TargetDirection = direction2cursor;
                    float angleDiff = Vector3.Angle(m_PrevTargetDirection, m_TargetDirection);
                    if (angleDiff > CHANGE_TARGET_ANGLE_BUFFER)
                    {
                        m_ChangeTarget = true;
                    }
                    m_PrevTargetDirection = m_TargetDirection;

                    bool attackState = m_TopDownPlayer.animator.GetCurrentAnimatorStateInfo(0).IsName("AttackCombo");

                    if (!m_Attack_combo_started && !isAttacking && !attackState)
                    {
                        IGameCharacter npc = m_PrimaryTargetNPC;
#if TESTING_USE_ALL_NPC_ARRAY
                        m_PrimaryTargetNPC = _getPrimaryTarget();
#else
                        m_PrimaryTargetNPC = _getPrimaryTargetInZone();
#endif
                        if (m_PrimaryTargetNPC != npc)
                        {
                            if (npc != null)
                            {
                                npc.attack_end_notify(this, 1);
                            }
                        }
                        m_BreakCombo = false;
                        m_TopDownPlayer.character.turnTransformToDirection(m_TargetDirection);
                        m_TopDownPlayer.animator.SetBool(/*"pAttack1"*/ HashIDs.Attack1Bool, true);
                        m_Attack_combo_started = true;
                        if (m_PrimaryTargetNPC != null)
                        {
                            m_InCombat = true;
                            if (enableJumpToTarget)
                            {
                                _jumpToTarget();
                            }
                        }
                    }
                    else
                    {
                        m_BreakCombo = false;
                    }
                }
            }
        }