chenxin
2020-12-14 51e7bc7c01b28264c5ebfbeec3542efc3adf5cdc
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
using System;
using Core.Economy;
using Core.Utilities;
using UnityEngine;
 
namespace TowerDefense.Economy
{
    /// <summary>
    /// A class for currency gain
    /// </summary>
    [Serializable]
    public class CurrencyGainer
    {
        /// <summary>
        /// The amount gained with the gain rate
        /// </summary>
        public int constantCurrencyAddition;
 
        /// <summary>
        /// The speed of currency gain in units-per-second
        /// </summary>
        [Header("The Gain Rate in additions-per-second")]
        public float constantCurrencyGainRate;
 
        /// <summary>
        /// Event for when the currency is changed
        /// </summary>
        public event Action<CurrencyChangeInfo> currencyChanged;
 
        /// <summary>
        /// The timer for constant currency gain
        /// </summary>
        protected RepeatingTimer m_GainTimer;
 
        /// <summary>
        /// Gets the currency that this CurrencyGainer modifes
        /// </summary>
        public Currency currency { get; private set; }
 
        /// <summary>
        /// Initializes the currency gainer with new data
        /// </summary>
        /// <param name="currencyController">
        /// The currency controller to modify with this currency gainer
        /// </param>
        /// <param name="gainAddition">
        /// The currency gained with each addition
        /// </param>
        /// <param name="gainRate">
        /// The rate of gain
        /// </param>
        public void Initialize(Currency currencyController, int gainAddition, float gainRate)
        {
            constantCurrencyAddition = gainAddition;
            constantCurrencyGainRate = gainRate;
            Initialize(currencyController);
        }
 
        /// <summary>
        /// Initializes the currency gainer
        /// </summary>
        public void Initialize(Currency currencyController)
        {
            currency = currencyController;
            UpdateGainRate(constantCurrencyGainRate);
        }
 
        /// <summary>
        /// For updating the gain timer
        /// </summary>
        /// <param name="deltaTime">
        /// The change in time to update the timer
        /// </param>
        public void Tick(float deltaTime)
        {
            if (m_GainTimer == null)
            {
                return;
            }
            m_GainTimer.Tick(Time.deltaTime);
        }
 
        /// <summary>
        /// Sets the currency gain rate and activates the timer
        /// </summary>
        /// <param name="currencyGainRate">
        /// The amount to set the constant gain rate to
        /// </param>
        public void UpdateGainRate(float currencyGainRate)
        {
            constantCurrencyGainRate = currencyGainRate;
            if (currencyGainRate < 0)
            {
                throw new ArgumentOutOfRangeException("currencyGainRate");
            }
            if (m_GainTimer == null)
            {
                m_GainTimer = new RepeatingTimer(1 / constantCurrencyGainRate, ConstantGain);
            }
            else
            {
                m_GainTimer.SetTime(1 / constantCurrencyGainRate);
            }
        }
 
        /// <summary>
        /// Increase the currency by m_ConstantCurrencyAddition
        /// </summary>
        protected void ConstantGain()
        {
            int previousCurrency = currency.currentCurrency;
            currency.AddCurrency(constantCurrencyAddition);
            int currentCurrency = currency.currentCurrency;
            var info = new CurrencyChangeInfo(previousCurrency, currentCurrency);
            if (currencyChanged != null)
            {
                currencyChanged(info);
            }
        }
    }
}