UnityGameProjectsCode / Rise2Point0Game / Level / UnlockSystem.cs
UnlockSystem.cs
Raw
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class UnlockSystem : MonoBehaviour
{
    private GameObject unlockButton;
    public GameObject unlockPanel;
    private float playerScore;
    private ScoreManager scoreMgr;
    private DeathWall dWall;
    private SoundManager soundMgr;
    private ApplyForceToPlayer applyForce;
    private ApplyForceTouch applyForceTouch;
    private ApplyForceController applyForceController;
    private LevelGenerator levelGen;
    private AchievementSystem achSys;
    public Material trailParticleMat;
    private bool chillModeEnabled;

    private struct trailPreset
    {
        public float maxTrailWidth;
        public List<float> graphXPositions;
        public List<float> graphYPositions;
        public float trailTime;
        public float alphaPosition;
    };

    trailPreset defaultTrail = new trailPreset();
    trailPreset curvedTrail = new trailPreset();
    trailPreset longTrail = new trailPreset();
    trailPreset thickTrail = new trailPreset();

    public TextMeshProUGUI highScoreText;
    public Sprite defaultPlayerSprite;
    public GameObject defaultPlayerDeathParticles;
    public GameObject defaultPlayerImpactParticles;
    public TMP_Dropdown lightColorDrop;
    public TMP_Dropdown playerColorDrop;
    public TMP_Dropdown trailColorDrop;

    public GameObject unlocksGrid;
    private List<GameObject> unlockBarriers = new List<GameObject>();
    private List<GameObject> unlockButtons = new List<GameObject>();
    private List<GameObject> unlockChecks = new List<GameObject>();
    private List<TextMeshProUGUI> unlockCosts = new List<TextMeshProUGUI>();

    public string[] unlockTracks = new string[4];
    public AudioClip[] defaultImpactSounds = new AudioClip[12];
    public AudioClip[] impactSoundPackOne = new AudioClip[12];
    public AudioClip[] impactSoundPackTwo = new AudioClip[12];
    public int unlockIncrement;

    private GameObject playerObject;
    private Light playerLight;
    private PlayerColorTransition pColorTrans;
    private MultipleAudioClips playerImpactSounds;

    private Color[] playerLightColors = new Color[]
    {
        new Color(1, 1, 1, 1), //white
        new Color(0, 1, 0, 1), //green
        new Color(0, 0.75f, 1, 1), //blue
        new Color(1, 0, 0, 1), //red
        new Color(1, 0.67f, 0, 1), //orange
        new Color(1, 0.95f, 0, 1), //gold
        new Color(1, 0.32f, 0.93f, 1), //pink
        new Color(0.56f, 0, 1, 1) //purple
    };

    private void Awake()
    {
        //values for default trail
        defaultTrail.maxTrailWidth = 0.9f;
        defaultTrail.graphXPositions = new List<float>();
        defaultTrail.graphYPositions = new List<float>();
        defaultTrail.graphXPositions.Add(0);
        defaultTrail.graphXPositions.Add(0.139f);
        defaultTrail.graphXPositions.Add(0.524f);
        defaultTrail.graphXPositions.Add(1);
        defaultTrail.graphYPositions.Add(1);
        defaultTrail.graphYPositions.Add(0.547f);
        defaultTrail.graphYPositions.Add(0.211f);
        defaultTrail.graphYPositions.Add(0);
        defaultTrail.trailTime = 0.5f;
        defaultTrail.alphaPosition = 0.141f;

        //values for curved trail
        curvedTrail.maxTrailWidth = 1;
        curvedTrail.graphXPositions = new List<float>();
        curvedTrail.graphYPositions = new List<float>();
        curvedTrail.graphXPositions.Add(0);
        curvedTrail.graphXPositions.Add(0.161f);
        curvedTrail.graphXPositions.Add(0.300f);
        curvedTrail.graphXPositions.Add(0.429f);
        curvedTrail.graphXPositions.Add(0.587f);
        curvedTrail.graphXPositions.Add(1);
        curvedTrail.graphYPositions.Add(0.783f);
        curvedTrail.graphYPositions.Add(0.867f);
        curvedTrail.graphYPositions.Add(0.623f);
        curvedTrail.graphYPositions.Add(0.711f);
        curvedTrail.graphYPositions.Add(0.251f);
        curvedTrail.graphYPositions.Add(0);
        curvedTrail.trailTime = 0.5f;
        curvedTrail.alphaPosition = 0.279f;

        //values for long trail
        longTrail.maxTrailWidth = 0.9f;
        longTrail.graphXPositions = new List<float>();
        longTrail.graphYPositions = new List<float>();

        longTrail.graphXPositions.Add(0);
        longTrail.graphXPositions.Add(0.164f);
        longTrail.graphXPositions.Add(0.417f);
        longTrail.graphXPositions.Add(1);

        longTrail.graphYPositions.Add(1);
        longTrail.graphYPositions.Add(0.463f);
        longTrail.graphYPositions.Add(0.155f);
        longTrail.graphYPositions.Add(0);

        longTrail.trailTime = 1f;
        longTrail.alphaPosition = 0.376f;

        //values for thick trail
        thickTrail.maxTrailWidth = 1.2f;
        thickTrail.graphXPositions = new List<float>();
        thickTrail.graphYPositions = new List<float>();

        thickTrail.graphXPositions.Add(0);
        thickTrail.graphXPositions.Add(0.183f);
        thickTrail.graphXPositions.Add(0.529f);
        thickTrail.graphXPositions.Add(1);

        thickTrail.graphYPositions.Add(1);
        thickTrail.graphYPositions.Add(0.602f);
        thickTrail.graphYPositions.Add(0.211f);
        thickTrail.graphYPositions.Add(0);

        thickTrail.trailTime = 0.6f;
        thickTrail.alphaPosition = 0.365f;

    }


    private void Start()
    {
        unlockButton = GUIManager.GetObject(15);
        scoreMgr = GetComponent<ScoreManager>();
        dWall = ObjectManager.GetObject(2).GetComponent<DeathWall>();
        soundMgr = GetComponent<SoundManager>();
        playerObject = ObjectManager.GetObject(0);
        pColorTrans = playerObject.GetComponent<PlayerColorTransition>();
        playerImpactSounds = playerObject.GetComponent<MultipleAudioClips>();
        applyForce = ObjectManager.GetObject(3).GetComponent<ApplyForceToPlayer>();
        applyForceTouch = ObjectManager.GetObject(3).GetComponent<ApplyForceTouch>();
        applyForceController = ObjectManager.GetObject(3).GetComponent<ApplyForceController>();
        levelGen = GetComponent<LevelGenerator>();
        achSys = ObjectManager.GetObject(4).GetComponent<AchievementSystem>();

        playerColorDrop.value = 1;
        lightColorDrop.value = 0;
        trailColorDrop.value = 2;

        foreach (RectTransform child in unlocksGrid.GetComponentsInChildren<RectTransform>())
        {
            if (child.name.Contains("Unlock Button"))
            {
                RectTransform[] buttonParts = child.GetComponentsInChildren<RectTransform>();

                for (int i = 0; i < buttonParts.Length; i++)
                {
                    if (buttonParts[i].name == "Unlock Image")
                    {
                        unlockButtons.Add(buttonParts[i].gameObject);
                    }

                    if (buttonParts[i].name == "Check Mark")
                    {
                        unlockChecks.Add(buttonParts[i].gameObject);
                        buttonParts[i].gameObject.SetActive(false);
                    }

                    if (buttonParts[i].name == "Cost Text")
                    {
                        unlockCosts.Add(buttonParts[i].GetComponent<TextMeshProUGUI>());
                    }

                    if (buttonParts[i].name == "Lock")
                    {
                        unlockBarriers.Add(buttonParts[i].gameObject);
                    }
                }
            }
        }

        foreach (Transform child in playerObject.GetComponentsInChildren<Transform>())
        {
            if (child.name == "Glow")
            {
                playerLight = child.GetComponent<Light>();
                break;
            }
        }

        SetUnlockCostTexts();
    }

    private void Update()
    {
        if (unlockButton.GetComponent<Button>().interactable == true)
        {
            if (playerObject.transform.position.y + 3.5 > dWall.movementThreshold)
            {
                unlockButton.GetComponent<Animator>().SetTrigger("fadeOut");
                unlockPanel.SetActive(false);

                if (unlockButton.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("Idle"))
                {
                    unlockButton.GetComponent<Button>().interactable = false;
                }
            }
        }
    }

    public void SetUnlockCostTexts()
    {
        int costValue = unlockIncrement;

        for (int i = 0; i < 24; i++)
        {
            unlockCosts[i].text = costValue.ToString();
            costValue += unlockIncrement;
        }
    }

    public void SetChillModeState(bool state)
    {
        chillModeEnabled = state;
    }

    public void ActivateUnlocksButton()
    {
        unlockButton.GetComponent<Button>().interactable = true;
        unlockButton.GetComponent<Animator>().SetTrigger("fadeIn");
    }

    public void CheckHighestScore()
    {
        playerScore = scoreMgr.GetHighestScoreAchieved();

        highScoreText.text = "Session Score: " + playerScore;

        int index = 0;
        int maxUnlockScore = unlockIncrement * 24;

        for (int i = unlockIncrement; (i <= playerScore && i <= maxUnlockScore); i += unlockIncrement)
        {
            if (unlockBarriers[index] != null)
            {
                unlockBarriers[index].SetActive(false);
                unlockButtons[index].GetComponent<Button>().interactable = true;
                index++;
            }
            else
                break;
        }

        if (playerScore >= maxUnlockScore)
            achSys.SetAllUnlocksGot(true);

        if (!unlockBarriers[9].activeSelf && !unlockBarriers[16].activeSelf && !unlockBarriers[19].activeSelf)
            achSys.SetAllColorDropsGot(true);

        //for all unlock barriers after the last indexed one, lock them.
        for (int i = index; i < 24; i++)
        {
            if (unlockBarriers[i] != null)
            {
                unlockBarriers[i].SetActive(true);
                unlockButtons[i].GetComponent<Button>().interactable = false;
            }
        }
    }

    public void ApplyScoreBoost(int boostAmt)
    {
        scoreMgr.SetBoostAmount(boostAmt);
    }

    public void ApplySpeedBoost()
    {
        if (applyForce.enabled)
            applyForce.SetUnlockBoosted(true);
        else if (applyForceTouch.enabled)
            applyForceTouch.SetUnlockBoosted(true);
        else if (applyForceController.enabled)
            applyForceController.SetUnlockBoosted(true);
    }

    public void EnableSlowMotion()
    {
        //call to the player object to enable the slow motion script
        playerObject.GetComponent<SlowMotionAbility>().enabled = true;
    }

    public void ChangeScoreGainParticles(int systemID)
    {
        //call to GUIManager to change particle system
        GUIManager.SetNewScoreParticleSystem(systemID);
    }

    public void ChangePlayerModel(Sprite newSprite)
    {
        playerObject.GetComponent<SpriteRenderer>().sprite = newSprite;

        string spriteName = newSprite.name;

        if (spriteName.Contains("Square"))
        {
            playerObject.GetComponent<CircleCollider2D>().enabled = false;

            playerObject.GetComponent<BoxCollider2D>().enabled = true;
        }
        else if (spriteName.Contains("Hexagon") || spriteName.Contains("Diamond"))
        {
            if (playerObject.GetComponent<PolygonCollider2D>())
                Destroy(playerObject.GetComponent<PolygonCollider2D>());

            playerObject.GetComponent<CircleCollider2D>().enabled = false;

            playerObject.AddComponent<PolygonCollider2D>();

            playerObject.GetComponent<PolygonCollider2D>().enabled = true;
            playerObject.GetComponent<BoxCollider2D>().enabled = false;
        }
        else if (spriteName.Contains("Circle"))
        {
            playerObject.GetComponent<CircleCollider2D>().enabled = true;

            playerObject.GetComponent<BoxCollider2D>().enabled = false;
        }
    }

    public void ChangePlayerTrail(int presetID)
    {
        AnimationCurve newCurve = new AnimationCurve();
        TrailRenderer playerTrail = playerObject.GetComponent<TrailRenderer>();

        switch (presetID)
        {
            case 0:
                newCurve.AddKey(defaultTrail.graphXPositions[0], defaultTrail.graphYPositions[0]);
                newCurve.AddKey(defaultTrail.graphXPositions[1], defaultTrail.graphYPositions[1]);
                newCurve.AddKey(defaultTrail.graphXPositions[2], defaultTrail.graphYPositions[2]);
                newCurve.AddKey(defaultTrail.graphXPositions[3], defaultTrail.graphYPositions[3]);

                playerTrail.widthCurve = newCurve;
                playerTrail.widthMultiplier = defaultTrail.maxTrailWidth;
                playerTrail.time = defaultTrail.trailTime;
                playerTrail.colorGradient.alphaKeys[1].time = defaultTrail.alphaPosition;

                break;

            case 1:
                newCurve.AddKey(thickTrail.graphXPositions[0], thickTrail.graphYPositions[0]);
                newCurve.AddKey(thickTrail.graphXPositions[1], thickTrail.graphYPositions[1]);
                newCurve.AddKey(thickTrail.graphXPositions[2], thickTrail.graphYPositions[2]);
                newCurve.AddKey(thickTrail.graphXPositions[3], thickTrail.graphYPositions[3]);

                playerTrail.widthCurve = newCurve;
                playerTrail.widthMultiplier = thickTrail.maxTrailWidth;
                playerTrail.time = thickTrail.trailTime;
                playerTrail.colorGradient.alphaKeys[1].time = thickTrail.alphaPosition;

                break;

            case 2:
                newCurve.AddKey(longTrail.graphXPositions[0], longTrail.graphYPositions[0]);
                newCurve.AddKey(longTrail.graphXPositions[1], longTrail.graphYPositions[1]);
                newCurve.AddKey(longTrail.graphXPositions[2], longTrail.graphYPositions[2]);
                newCurve.AddKey(longTrail.graphXPositions[3], longTrail.graphYPositions[3]);

                playerTrail.widthCurve = newCurve;
                playerTrail.widthMultiplier = longTrail.maxTrailWidth;
                playerTrail.time = longTrail.trailTime;
                playerTrail.colorGradient.alphaKeys[1].time = longTrail.alphaPosition;

                break;

            case 3:
                newCurve.AddKey(curvedTrail.graphXPositions[0], curvedTrail.graphYPositions[0]);
                newCurve.AddKey(curvedTrail.graphXPositions[1], curvedTrail.graphYPositions[1]);
                newCurve.AddKey(curvedTrail.graphXPositions[2], curvedTrail.graphYPositions[2]);
                newCurve.AddKey(curvedTrail.graphXPositions[3], curvedTrail.graphYPositions[3]);
                newCurve.AddKey(curvedTrail.graphXPositions[4], curvedTrail.graphYPositions[4]);
                newCurve.AddKey(curvedTrail.graphXPositions[5], curvedTrail.graphYPositions[5]);

                playerTrail.widthCurve = newCurve;
                playerTrail.widthMultiplier = curvedTrail.maxTrailWidth;
                playerTrail.time = curvedTrail.trailTime;
                playerTrail.colorGradient.alphaKeys[1].time = curvedTrail.alphaPosition;

                break;
        }
    }

    public void ChangePlayerTrailColor()
    {
        Color newColor = playerLightColors[trailColorDrop.value];

        trailParticleMat.EnableKeyword("_EMISSION");
        trailParticleMat.SetColor("_EmissionColor", newColor);
        playerObject.GetComponent<PlayerTrailParticles>().SetParticleColor(newColor);

        newColor.a = 0;

        playerObject.GetComponent<TrailRenderer>().startColor = newColor;
        playerObject.GetComponent<TrailRenderer>().endColor = newColor;

    }

    public void ChangePlayerLightColor()
    {
        //may want to also change intensity of light based on color
        playerLight.color = playerLightColors[lightColorDrop.value];
    }

    public void ChangePlayerColor()
    {
        pColorTrans.PlayerColor = playerLightColors[playerColorDrop.value];
        pColorTrans.EndingColor = playerLightColors[playerColorDrop.value];
    }

    public void ChangePlayerDeathParticles(GameObject newParticles)
    {
        playerObject.GetComponent<PlayerDeathEffects>().SetDeathParticles(newParticles);
    }

    public void ChangePlayerImpactParticles(GameObject newParticles)
    {
        playerObject.GetComponent<PlayerImpactEffect>().SetNewImpactParticles(newParticles);
    }

    public void AddSongToLibrary(int trackID)
    {
        soundMgr.AddMusicToLibrary(unlockTracks[trackID]);
    }

    public void ChangeImpactSounds(int listID)
    {
        switch (listID)
        {
            default:
                playerImpactSounds.SetClips(defaultImpactSounds.ToList());
                break;
            case 0:
                playerImpactSounds.SetClips(impactSoundPackOne.ToList());
                break;
            case 1:
                playerImpactSounds.SetClips(impactSoundPackTwo.ToList());
                break;
        }
    }

    public void ChangeBackground()
    {
        //call to the level gen to change the background of all created tiles.
        levelGen.ChangeAllTilesBackgroundMaterials();
    }

    public void ResetCosmetics()
    {
        playerColorDrop.value = 1;
        lightColorDrop.value = 0;
        trailColorDrop.value = 2;

        playerObject.GetComponent<SpriteRenderer>().sprite = defaultPlayerSprite;
        playerObject.GetComponent<SpriteRenderer>().color = Color.green;
        pColorTrans.PlayerColor = Color.green;
        ChangePlayerTrail(0);
        playerObject.GetComponent<TrailRenderer>().startColor = new Color(0, 0.79f, 1, 0);
        playerObject.GetComponent<TrailRenderer>().endColor = new Color(0, 0.79f, 1, 0);
        playerLight.color = Color.white;
        playerImpactSounds.SetClips(defaultImpactSounds.ToList());
        playerObject.GetComponent<PlayerDeathEffects>().SetDeathParticles(defaultPlayerDeathParticles);
        playerObject.GetComponent<PlayerImpactEffect>().SetNewImpactParticles(defaultPlayerImpactParticles);
        GUIManager.SetNewScoreParticleSystem(0);
        ChangeImpactSounds(-1);

        unlockChecks[0].SetActive(false);
        unlockChecks[1].SetActive(false);
        unlockChecks[2].SetActive(false);
        unlockChecks[3].SetActive(false);
        unlockChecks[4].SetActive(false);
        unlockChecks[6].SetActive(false);
        unlockChecks[7].SetActive(false);
        unlockChecks[11].SetActive(false);
        unlockChecks[12].SetActive(false);
        unlockChecks[14].SetActive(false);
        unlockChecks[15].SetActive(false);
        unlockChecks[18].SetActive(false);
        unlockChecks[20].SetActive(false);
        unlockChecks[21].SetActive(false);

        playerObject.GetComponent<CircleCollider2D>().enabled = true;

        if (playerObject.GetComponent<BoxCollider2D>())
            playerObject.GetComponent<BoxCollider2D>().enabled = false;

        if (playerObject.GetComponent<PolygonCollider2D>())
            playerObject.GetComponent<PolygonCollider2D>().enabled = false;

        levelGen.RevertAllBackgroundMaterials();
    }

    public void ResetAddedSongs()
    {
        soundMgr.RemoveMusicFromLibrary(unlockTracks);

        unlockChecks[5].SetActive(false);
        unlockChecks[10].SetActive(false);
        unlockChecks[17].SetActive(false);
    }

    public void ResetBoosts()
    {
        //remove any score or speed boosts
        applyForce.SetUnlockBoosted(false);
        applyForceController.SetUnlockBoosted(false);
        applyForceTouch.SetUnlockBoosted(false);
        scoreMgr.SetBoostAmount(0);
        playerObject.GetComponent<SlowMotionAbility>().enabled = false;

        unlockChecks[8].SetActive(false);
        unlockChecks[13].SetActive(false);
        unlockChecks[22].SetActive(false);
        unlockChecks[23].SetActive(false);
    }
}