public void ExecuteAttack(CharacterManager attacker, CharacterManager defender)
    {
        if (!defender.isDead())
        {
            double damage = GameLogicManager.CalculateDamage(attacker, defender);
            defender.ApplyDamage(damage);

            // check abilities that trigger on attack
            AbilityManager.CheckTriggeredAbilitiesActivation(TriggeredTriggerType.OnInflictedAttack, attacker, defender);
            AbilityManager.CheckTriggeredAbilitiesActivation(TriggeredTriggerType.OnReceivedAttack, defender, attacker);

            if (defender.isDead())
            {
                // check abilities that trigger on death
                AbilityManager.CheckTriggeredAbilitiesActivation(TriggeredTriggerType.OnKill, attacker, defender);
                AbilityManager.CheckTriggeredAbilitiesActivation(TriggeredTriggerType.OnDeath, defender, attacker);

                // check again in case of resurrection
                if (defender.isDead())
                {
                    Kill(defender);
                }
            }

            if (defender.gameObject.CompareTag("Player"))
            {
                UpdateHealthBar();
            }
        }
    }