Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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;
}