Skip to content
Snippets Groups Projects
StatsManager.cs 3.43 KiB
Newer Older
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum UpgradeTypes
{
    ENEMY_HEALTH,
    ENEMY_DAMAGE,
    ENEMY_ARMOR,
    MANA_COST,
}

class UpgradeData
{
    public Upgrade upgrade;
    public int count;

    public int GetUnadjustedNextUpgradeCost()
    {
        return (int)(upgrade.baseCost * (1 + count * upgrade.costMultiplier));
    }

    public float GetTotalEffectMultiplier()
    {
        return 1 + count * upgrade.effectMultiplier;
    }
}

public class StatsManager : MonoBehaviour
{

    public static StatsManager instance { get; private set; }

    EnemyStats currentEnemyStats;
    PlayerStats currentPlayerStats;
    [SerializeField] int currentMana;

    [SerializeField] List<Upgrade> availableUpgrades;
    Dictionary<UpgradeTypes, UpgradeData> upgrades = new Dictionary<UpgradeTypes, UpgradeData>();

    public EnemyStats GetEnemyStats()
    {
        return currentEnemyStats;
    }

    public PlayerStats GetPlayerStats(int stage)
    {
        // TODO use `stage`
        return currentPlayerStats;
    }

    public int GetMana()
    {
        return currentMana;
    }

    // Adjusts the given Mana cost based on the amount of Mana cost upgrades currently bought.
    public int GetAdjustedManaCost(int cost)
    {
        return (int)(cost * upgrades[UpgradeTypes.MANA_COST].GetTotalEffectMultiplier());
    }

    public int GetNextUpgradeCost(UpgradeTypes type)
    {
        return GetAdjustedManaCost(upgrades[type].GetUnadjustedNextUpgradeCost());
    }

    // Buys an upgrade, spending the required amount of Mana in the process. Returns false if not enough Mana is available.
    public bool BuyUpgrade(UpgradeTypes type)
    {
        if (!ModifyMana(GetNextUpgradeCost(type)))
        {
            return false;
        }
        upgrades[type].count++;
        RecalculateStatMultipliers();
        return true;
    }

    // Add (positive value) or spend (negative value) Mana.
    public bool ModifyMana(int delta)
    {
        if (currentMana + delta < 0)
        {
            return false;
        }
        currentMana += delta;
        return true;
    }

    void RecalculateStatMultipliers()
    {
        currentEnemyStats.healthMultiplier = upgrades[UpgradeTypes.ENEMY_HEALTH].GetTotalEffectMultiplier();
        currentEnemyStats.damageMultiplier = upgrades[UpgradeTypes.ENEMY_DAMAGE].GetTotalEffectMultiplier();
        currentEnemyStats.armorMultiplier = upgrades[UpgradeTypes.ENEMY_ARMOR].GetTotalEffectMultiplier();
    }

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }
        DontDestroyOnLoad(gameObject);

        foreach (Upgrade upgrade in availableUpgrades)
        {
            UpgradeData upgradeData = new UpgradeData();
            upgrades.Add(upgrade.type, upgradeData);
        }

        currentEnemyStats.healthMultiplier = 1f;
        currentEnemyStats.damageMultiplier = 1f;
        currentEnemyStats.armorMultiplier = 1f;
        currentPlayerStats.healthMultiplier = 1f;
        currentPlayerStats.damageMultiplier = 1f;
        currentPlayerStats.armorMultiplier = 1f;
    }
}

public struct EnemyStats
{
    public float healthMultiplier;
    public float damageMultiplier;
    public float armorMultiplier;
}

public struct PlayerStats
{
    public float healthMultiplier;
    public float damageMultiplier;
    public float armorMultiplier;
}