From 2ddeae6b3b78a5d23324ca6e9a3a79e96ec849ee Mon Sep 17 00:00:00 2001 From: Adrian Paschkowski <git@wasdennnoch.me> Date: Mon, 12 Apr 2021 20:18:09 +0200 Subject: [PATCH] Add preliminary StatsManager --- Assets/Prefabs/GlobalScripts.prefab | 45 ++++++++ Assets/Prefabs/GlobalScripts.prefab.meta | 7 ++ Assets/Scripts/StatsManager.cs | 137 +++++++++++++++++++++++ Assets/Scripts/StatsManager.cs.meta | 11 ++ Assets/Scripts/Upgrades.meta | 8 ++ Assets/Scripts/Upgrades/Upgrade.cs | 14 +++ Assets/Scripts/Upgrades/Upgrade.cs.meta | 11 ++ 7 files changed, 233 insertions(+) create mode 100644 Assets/Prefabs/GlobalScripts.prefab create mode 100644 Assets/Prefabs/GlobalScripts.prefab.meta create mode 100644 Assets/Scripts/StatsManager.cs create mode 100644 Assets/Scripts/StatsManager.cs.meta create mode 100644 Assets/Scripts/Upgrades.meta create mode 100644 Assets/Scripts/Upgrades/Upgrade.cs create mode 100644 Assets/Scripts/Upgrades/Upgrade.cs.meta diff --git a/Assets/Prefabs/GlobalScripts.prefab b/Assets/Prefabs/GlobalScripts.prefab new file mode 100644 index 0000000..fdce5da --- /dev/null +++ b/Assets/Prefabs/GlobalScripts.prefab @@ -0,0 +1,45 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &5959683136170450115 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6628969328331147427} + - component: {fileID: 3799051240971953} + m_Layer: 0 + m_Name: GlobalScripts + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6628969328331147427 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5959683136170450115} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3799051240971953 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5959683136170450115} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f757c0257b830f4db4003340aceb7c3, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/Prefabs/GlobalScripts.prefab.meta b/Assets/Prefabs/GlobalScripts.prefab.meta new file mode 100644 index 0000000..d4cf168 --- /dev/null +++ b/Assets/Prefabs/GlobalScripts.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: afeb708bd829d8a4aa0310ed2cd87a74 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/StatsManager.cs b/Assets/Scripts/StatsManager.cs new file mode 100644 index 0000000..ee00be5 --- /dev/null +++ b/Assets/Scripts/StatsManager.cs @@ -0,0 +1,137 @@ +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; +} diff --git a/Assets/Scripts/StatsManager.cs.meta b/Assets/Scripts/StatsManager.cs.meta new file mode 100644 index 0000000..7140d5c --- /dev/null +++ b/Assets/Scripts/StatsManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1f757c0257b830f4db4003340aceb7c3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Upgrades.meta b/Assets/Scripts/Upgrades.meta new file mode 100644 index 0000000..4623561 --- /dev/null +++ b/Assets/Scripts/Upgrades.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95ff68de1ef63ea4e960cad9ce01717d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Upgrades/Upgrade.cs b/Assets/Scripts/Upgrades/Upgrade.cs new file mode 100644 index 0000000..162ed72 --- /dev/null +++ b/Assets/Scripts/Upgrades/Upgrade.cs @@ -0,0 +1,14 @@ +using UnityEngine; + +[CreateAssetMenu(menuName = "Upgrade")] +public class Upgrade : ScriptableObject +{ + + public UpgradeTypes type; + public string upgradeName; + public int baseCost; + public float costMultiplier; + public Sprite shopSprite; + [Tooltip("Multiplier of the stat that this Upgrade controls")] public float effectMultiplier; + +} diff --git a/Assets/Scripts/Upgrades/Upgrade.cs.meta b/Assets/Scripts/Upgrades/Upgrade.cs.meta new file mode 100644 index 0000000..91b10cc --- /dev/null +++ b/Assets/Scripts/Upgrades/Upgrade.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fcdf785d9cc66854b866905ab5edbb2e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- GitLab