using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class MarioController : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float jumpForce = 5f;
    public float ladderClimbSpeed = 2f;
    public int maxHealth = 3;
    private int currentHealth;
    private bool grounded;
    private bool onLadder;
    private bool climbingLadder;
    private Vector2 direction;
    private Rigidbody2D rb2d;
    private new Collider2D collider;
    private Collider2D[] results;
    private int currentSceneIndex;

    public float hammerDuration = 9f;

    private bool isHammerActive;
    private float hammerTimer;

    [Header("Effects")]
    [Tooltip("The effect to create when colliding with Hammer")]
    public GameObject hammerEffect;


    private void Awake()
    {
        rb2d = GetComponent<Rigidbody2D>();
        collider = GetComponent<Collider2D>();
        results = new Collider2D[4];
    }

    private void Start()
    {
        currentHealth = maxHealth;
        currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
    }

    private void CheckCollision()
    {
        grounded = false;
        onLadder = false;

        Vector2 size = collider.bounds.size;
        size.y += 0.1f;
        size.x /= 2f;

        int amount = Physics2D.OverlapBoxNonAlloc(transform.position, size, 0f, results);

        for (int i = 0; i < amount; i++)
        {
            GameObject hit = results[i].gameObject;

            if (hit.layer == LayerMask.NameToLayer("Platform"))
            {
                grounded = hit.transform.position.y < (transform.position.y - 0.5f);
            }
            else if (hit.layer == LayerMask.NameToLayer("Ladder"))
            {
                onLadder = true;
            }
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.layer == LayerMask.NameToLayer("Barrel") && isHammerActive)
        {
            Destroy(collision.gameObject);
        }
        else if (collision.gameObject.layer == LayerMask.NameToLayer("Hammer"))
        {
            Destroy(collision.gameObject);
            ActivateHammer();
            if (hammerEffect != null)
            {
                Instantiate(hammerEffect, transform.position, transform.rotation, null);
            }
        }
        else if (collision.gameObject.layer == LayerMask.NameToLayer("Barrel"))
        {
            currentHealth--;
            ResetScene();
        }
        else if (collision.gameObject.layer == LayerMask.NameToLayer("Win"))
        {
            SceneManager.LoadScene("_Scene_DonkeyKong25M");
        }
    }

    private void ResetScene()
    {
        if (currentSceneIndex == 0)
        {
            SceneManager.LoadScene("_Scene_DonkeyKong25M2");
        }
        else if (currentSceneIndex == 1)
        {
            SceneManager.LoadScene("_Scene_DonkeyKong25M3");
        }
        else if (currentSceneIndex == 2)
        {
            SceneManager.LoadScene("_Scene_DonkeyKong25M");
        }
    }

    private void ActivateHammer()
    {
        isHammerActive = true;
        hammerTimer = hammerDuration;
    }

    private void ResetHammer()
    {
        isHammerActive = false;
    }

    private void Update()
    {
        CheckCollision();

        if (isHammerActive)
        {
            hammerTimer -= Time.deltaTime;
            if (hammerTimer <= 0)
            {
                ResetHammer();
            }
        }

        if (grounded && Input.GetButtonDown("Jump"))
        {
            rb2d.velocity = new Vector2(rb2d.velocity.x, jumpForce);
        }

        float movement = Input.GetAxis("Horizontal");

        if (grounded)
        {
            direction.y = Mathf.Max(direction.y, -1f);
            climbingLadder = false;
        }

        if (onLadder && Input.GetButton("Vertical"))
        {
            climbingLadder = true;
            float climbDirection = Input.GetAxis("Vertical");
            rb2d.velocity = new Vector2(0, climbDirection * ladderClimbSpeed);
            rb2d.gravityScale = 0f;
        }
        else if (climbingLadder)
        {
            rb2d.gravityScale = 1f;
            rb2d.velocity = new Vector2(rb2d.velocity.x, 0f);
            rb2d.constraints = RigidbodyConstraints2D.FreezePositionX;
        }
        else
        {
            rb2d.gravityScale = 1f;
            rb2d.constraints = RigidbodyConstraints2D.FreezeRotation;
        }

        rb2d.velocity = new Vector2(movement * moveSpeed, rb2d.velocity.y);

        if (movement > 0)
        {
            transform.localScale = new Vector3(1f, 1f, 1f);
        }
        else if (movement < 0)
        {
            transform.localScale = new Vector3(-1f, 1f, 1f);
        }
    }
}

add to this script if mario destroys a barrel when he has the hammer, it will give him +300 score. Here is the ScoreCounter script to reference: using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //This line enables use of uGUI classes like Text.

public class ScoreCounter : MonoBehaviour
{
    [Header("Dynamic")]
    public int score = 0;

    private Text uiText;

    // Start is called before the first frame update
    void Start()
    {
        uiText = GetComponent<Text>();
    }

    // Update is called once per frame
    void Update()
    {
        uiText.text = score.ToString("Score:#,0"); //This 0 is a zero!
    }
}