void HitByLaser(RaycastHit2D victim)
    {
        Debug.Log("Player shot: " + victim.collider.gameObject.name + " with tag: " + victim.collider.gameObject.tag);

        var enemyHealth = victim.collider.gameObject.GetComponent <EnemyHealth>();

        //NOTE: RaycastHit2D.transform returns parent transform, RaycastHit2D.collider returns the hit collider.
        switch (victim.collider.gameObject.tag)
        {
        //Add more cases as more types of enemies are added to the game

        case "SmallCritter":
        case "JumpingCritter":
            enemyHealth.TakeDamage(damage);
            break;

        case "HardCritter":
            //victim.transform.gameObject.GetComponent<HardCritter>().Rush();
            break;

        case "BigEyeGuy":
            //Can't be hurt by laser, play relevant things
            break;

        case "CrawlerCritter":
            if (victim.collider.gameObject.GetComponent <CrawlerCritter>().noShell)
            {
                enemyHealth.TakeDamage(damage);
            }
            else
            {
                //Can't be hurt by laser, play relevant things
            }
            break;

        case "ShellMan":
            ShellMan shellMan = victim.collider.gameObject.GetComponent <ShellMan>();
            if (shellMan.getDeShelled())
            {
                enemyHealth.TakeDamage(damage);
            }
            else
            {
                //Can't be hurt by laser, play relevant things
            }
            break;

        case "BirdBossWeakSpot":
            Debug.Log("Hit Bird in the Mouth!");
            victim.collider.transform.parent.GetComponent <BigBadBird>().TakeDamage();
            break;

        case "BigEyeGuyWeakSpot":
            Debug.Log("Hit EyeGuy in the Eye!");
            victim.collider.transform.parent.GetComponent <EnemyHealth>().TakeDamage(damage);
            break;

        case "FinalBossArmor":
            Debug.Log("Hit the boss in the armor!");
            victim.collider.gameObject.GetComponent <Phase1>().Stunned(7f);
            break;

        case "FinalBossArmor2":
            victim.collider.gameObject.GetComponent <Phase2>().Stunned(7f);
            break;

        case "FinalBossWeakSpot":
            Debug.Log("Hit the boss in the weak spot!");
            victim.collider.gameObject.GetComponent <Phase1>().Fall();
            break;

        case "FinalBossHead":
            Debug.Log("Hit the boss in the head!");
            victim.collider.gameObject.GetComponent <Phase2>().LaserShot();
            break;

        case "FinalBossLastForm":
            Debug.Log("Shot last boss form");
            //Check so that it goes after the correct child
            //victim.collider.gameObject.transform.GetChild(0).GetComponent<BigEyeGuy>().Shoot();
            break;

        case "Barrier":
            Debug.Log("Laser hit barrier");
            if (victim.collider.GetComponent <Barrier>().GetBarrierType().Equals("Laser"))
            {
                victim.collider.GetComponent <Barrier>().TakeDamage(1);
            }
            break;
        }
    }
    //OverlapBox check and damage all victims in area.
    IEnumerator DamageArea(float sizeX)
    {
        gizmoSizeX = sizeX;

        if (status.isMirrored)
        {
            victims = Physics2D.OverlapBoxAll(transform.position + new Vector3(-sizeX / 2, offset), new Vector2(sizeX, 2f), 0, whatIsPunchable);
        }
        else
        {
            victims = Physics2D.OverlapBoxAll(transform.position + new Vector3(sizeX / 2, offset), new Vector2(sizeX, 2f), 0, whatIsPunchable);
        }

        foreach (Collider2D victim in victims)
        {
            var enemyHealth = victim.gameObject.GetComponent <EnemyHealth>();
            if (attackType == "Branch" && !branchInv && victim.gameObject.tag != "Door")
            {
                if (inventory.GetHoldingItem().GetComponent <PickUpableItem>().Break() <= 0)
                {
                    inventory.SetHoldingItem(null);
                }
                branchInv = true;
            }

            switch (victim.gameObject.tag)
            {
            case "Door":
                victim.gameObject.GetComponent <Door>().SetInvisible();
                attackType = "Door";
                break;

            case "Barrier":
                Debug.Log("BarrierType: " + victim.gameObject.GetComponent <Barrier>().GetBarrierType());
                if (attackType == victim.gameObject.GetComponent <Barrier>().GetBarrierType())
                {
                    victim.gameObject.GetComponent <Barrier>().TakeDamage(damage);
                }
                //		attackType = "Barrier";
                break;

            case "SmallCritter":
            case "JumpingCritter":
                enemyHealth.TakeDamage(damage, gameObject, 4f);
                break;

            case "CrawlerCritter":
                if (victim.gameObject.GetComponent <CrawlerCritter>().noShell)
                {
                    enemyHealth.TakeDamage(damage, gameObject, 4f);
                }
                else
                {
                    enemyHealth.Knockback(gameObject, 4f);
                }
                break;

            case "ShellMan":
                ShellMan shellMan = victim.gameObject.GetComponent <ShellMan>();
                if (shellMan.getDeShelled())
                {
                    enemyHealth.TakeDamage(damage, gameObject, 4f);
                }
                else
                {
                    if (attackType == "Mega" || attackType == "FullMega")
                    {
                        shellMan.BreakShield(gameObject);
                    }
                    else
                    {
                        enemyHealth.Knockback(gameObject, 4f);
                    }
                }
                break;

            case "HardCritter":
                if (attackType == "Rock")
                {
                    enemyHealth.TakeDamage(damage, gameObject, 4f);
                }
                else if (attackType == "Mega" || attackType == "FullMega")
                {
                    enemyHealth.TakeDamage(damage, gameObject, 4f);
                }
                else
                {
                    enemyHealth.Knockback(gameObject, 4f);
                }
                break;

            case "BigEyeGuy":
                enemyHealth.Knockback(gameObject, 4f);
                break;

            case "StatueBossEye":
                if (attackType == "Branch")
                {
                    if (inventory.IsHoldingItem())
                    {
                        enemyHealth.TakeDamage(damage);
                        inventory.GetHoldingItem().GetComponent <PickUpableItem>().Break(3);
                        inventory.SetHoldingItem(null);
                    }
                }
                break;

            case "FinalBossWeakSpot":
                if (attackType == "FullMega")
                {
                    Debug.Log("Full MegaPunched the boss!");
                    victim.gameObject.GetComponent <Phase1>().TakeDamage(damage);
                }
                else if (attackType == "Mega")
                {
                    Debug.Log("Regular MegaPunched the boss!");
                    victim.gameObject.GetComponent <Phase1>().TakeDamage(damage);
                }
                else
                {
                    Debug.Log("Invulnerable to AttackType [ " + attackType + " ]");
                }
                break;

            case "FinalBossArmor2":
                if (victim.gameObject.GetComponent <Phase2>().blued)
                {
                    if (attackType == "FullMega")
                    {
                        Debug.Log("Full MegaPunched the boss phase 2!");
                        victim.gameObject.GetComponent <Phase2>().TakeDamage(damage);
                    }
                    else if (attackType == "Mega")
                    {
                        Debug.Log("Regular MegaPunched the boss phase 2!");
                        victim.gameObject.GetComponent <Phase2>().TakeDamage(damage);
                    }
                    else
                    {
                        Debug.Log("Invulnerable to AttackType [ " + attackType + " ]");
                    }
                }
                break;
            }
            Debug.Log("Punched [ " + victim + " ] - tag [ " + victim.gameObject.tag + " ] - attackType [ " + attackType + " ] - damage [ " + damage + " ]");
        }

        punchVisual.transform.localPosition = new Vector3(sizeX / 2, offset);
        punchVisual.GetComponent <Animator>().SetTrigger(attackType);

        //	if(!(attackType == "Door" || attackType == "Barrier"))
        GetComponent <AudioPlayer>().PlayClip(6, 1, 0.7f, 1.3f);

        yield return(new WaitForSeconds(0.1f));

        onCooldown = false;
        branchInv  = false;
    }