Newer
Older
HardPoint-Project-Abertay-University-Unity3D / Assets / Scripts / CharacterClasses / ClassSelection.cs
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Experimental.GlobalIllumination;

public class ClassSelection : MonoBehaviour
{
    public List<ClassBaseType> classes;
    public int currentClassIndex;
    public ClassBaseType selectedClass;
    [SerializeField]
    private List<GameObject> playerModels;
    private GameObject currentModel;

    private StatusEffects statusEffects;
    private HealthSystem healthSystem;
    
    [SerializeField]
    private UnityEvent NoMoreClassesAvailable;
    [SerializeField]
    private UnityEvent ClassSwitched;

    void Start()
    {
        if (classes.Count == 0) { Debug.LogError("No Classes in game"); return; }
        statusEffects = GetComponent<StatusEffects>();
        healthSystem = GetComponent<HealthSystem>();
        foreach(ClassBaseType c in classes)
        {
            c.Starter(gameObject);
        }
        currentClassIndex = 0;
        if(playerModels.Count == classes.Count)
        currentModel = playerModels[0];
        selectedClass = classes[currentClassIndex];
        UpdateStatus();
    }

    public void SwitchClasses()
    {
        if(classes.Count == 0) return;
        int startIndex = currentClassIndex;
        while (true) 
        {
            selectedClass.currentHp = healthSystem.GetHealth();
            currentClassIndex++;
            if (currentClassIndex == classes.Count) currentClassIndex = 0;
            selectedClass = classes[currentClassIndex];
            if (!selectedClass.dead) 
            {
                UpdateStatus();
                ChangeModel();
                ClassSwitched.Invoke();
                break;
            }
            if(currentClassIndex == startIndex)
            {
                NoMoreClassesAvailable.Invoke();
                break;
            }
        }
    }

    private void UpdateStatus()
    {
        statusEffects.maxHp = selectedClass.hp;
        healthSystem.EditHealth(selectedClass.currentHp);
        statusEffects.speedAir = selectedClass.speedAir;
        statusEffects.speedGround = selectedClass.speedGround;
    }
    public void KillCurrentChar()
    {
        if (classes.Count == 0) return;
        selectedClass.dead = true;
        SwitchClasses();
    }
    public void UseAbility()
    {
        if (classes.Count == 0) return;
        selectedClass.Ability(statusEffects);
        
    }
    public void CoolDowns()
    {
        if (classes.Count == 0) return;
        for (int i = 0; i < classes.Count; i++) {
            classes[i].Cooldown();
        }
    }

    public void ChangeModel()
    {
        if(playerModels.Count < classes.Count) return;
        currentModel.SetActive(false);
        currentModel = playerModels[currentClassIndex];
        currentModel.SetActive(true);
    }
}