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;
    private ScoreCounter scoreCounter;

    public float hammerDuration = 9f;

    private bool isHammerActive;
    private float hammerTimer;

    private static int previousScore = 0;
    private static int previousSceneIndex = 0;


    [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;
        scoreCounter = FindObjectOfType<ScoreCounter>();

        if (previousSceneIndex == 0 || previousSceneIndex == 1)
        {
            scoreCounter.score = previousScore;
        }
    }

    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);
            scoreCounter.score += 200;
        }
        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"))
        {
            scoreCounter.score += 500;
            SceneManager.LoadScene("_Scene_DonkeyKong25M");
        }
    }

    private void ResetScene()
    {
        previousScore = scoreCounter.score;
        previousSceneIndex = currentSceneIndex;

        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);
        }
    }
}




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!
    }
} with the MarioController script and the ScoreCounter script, modify the HighScore script so that it will update when currentSceneIndex == 2 transfers to currentSceneIndex == 0 if there is a new high score: using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; //We need this line for uGUI to work.

public class HighScore : MonoBehaviour
{
    static private Text _UI_TEXT;
    static private int _SCORE = 0;

    private Text txtCom; //txtCom is a reference to this GO's Text component

    void Awake()
    {
        _UI_TEXT = GetComponent<Text>();

        //If the PlayerPrefs HighScore already exists, read it
        if (PlayerPrefs.HasKey("HighScore"))
        {
            SCORE = PlayerPrefs.GetInt("HighScore");
        }
        //Assign the high score to HighScore
        PlayerPrefs.SetInt("HighScore", SCORE);
    }

    static public int SCORE
    {
        get { return _SCORE; }
        private set
        {
            _SCORE = value;
            PlayerPrefs.SetInt("HighScore", value);
            if (_UI_TEXT != null)
            {
                _UI_TEXT.text = "High Score:" + value.ToString("#,0");
            }
        }
    }

    static public void TRY_SET_HIGH_SCORE(int scoreToTry)
    {
        if (scoreToTry <= SCORE) return; //If scoreToTry is too low, return
        SCORE = scoreToTry;
    }

    //The following code allows you to easily reset the PlayerPrefs HighScore
    [Tooltip("Check this box to reset the HighScore in PlayerPrefs")]
    public bool resetHighScoreNow = false;

    private void OnDrawGizmos()
    {
        if (resetHighScoreNow)
        {
            resetHighScoreNow = false;
            PlayerPrefs.SetInt("HighScore", 0);
            Debug.LogWarning("PlayerPrefs HighScore reset to 1,000.");
        }
    }
}