gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/modifyx2/pool-bonus.go (about) 1 package modifyx 2 3 import ( 4 . "gitee.com/zhongguo168a/gocodes/datax/floatx" 5 ) 6 7 type IBonus interface { 8 Key() string 9 Factor() float64 10 Multiplier() float64 11 Bonus() float64 12 Valid() bool 13 } 14 15 func NewBonusAll(key string, bonus, factor, multiplier float64) (obj *Bonus) { 16 obj = &Bonus{ 17 key: key, 18 bonus: bonus, 19 factor: factor, 20 multiplier: multiplier, 21 } 22 return 23 } 24 func NewBonus(key string) (obj *Bonus) { 25 obj = &Bonus{ 26 key: key, 27 multiplier: 1.0, 28 } 29 return 30 } 31 32 type Bonus struct { 33 // 例如: CEffectDamage/Amount 34 key string 35 // 倍数计算后的加成 36 bonus float64 37 // 系数 38 factor float64 39 // 倍数 40 multiplier float64 `value:"1"` 41 } 42 43 func (a *Bonus) Valid() bool { 44 return true 45 } 46 47 func (a *Bonus) Combine(b IBonus) { 48 a.factor += b.Factor() 49 a.bonus += b.Bonus() 50 a.multiplier *= b.Multiplier() 51 } 52 53 func (b *Bonus) Key() string { 54 return b.key 55 } 56 57 func (b *Bonus) Factor() float64 { 58 return b.factor 59 } 60 61 func (b Bonus) Multiplier() float64 { 62 return b.multiplier 63 } 64 65 func (b Bonus) Bonus() float64 { 66 return b.bonus 67 } 68 69 func (b *Bonus) SetKey(val string) *Bonus { 70 b.key = val 71 return b 72 } 73 74 func (b *Bonus) SetFactor(val float64) *Bonus { 75 b.factor = val 76 return b 77 } 78 79 func (b *Bonus) SetMultiplier(val float64) *Bonus { 80 b.multiplier = val 81 return b 82 } 83 84 func (b *Bonus) SetBonus(val float64) *Bonus { 85 b.bonus = val 86 return b 87 } 88 89 // y = x * (1 + Factor)* Multiplier + Bonus 90 func CalculateBonusFactor(x float64, a IBonus, useFactor, useMultiplier, useBonus bool) (y float64) { 91 y = x 92 93 if a == nil { 94 return 95 } 96 97 factor := a.Factor() 98 // a.Factor != 0 99 if Neq(factor, 0) && useFactor == true { 100 y = x * (1 + factor) 101 } 102 103 multiplier := a.Multiplier() 104 // a.Multiplier != 1 105 if Neq(multiplier, 1) && useMultiplier == true { 106 y = y * multiplier 107 } 108 109 bonus := a.Bonus() 110 // a.Bonus != 0 111 if Neq(bonus, 0) && useBonus == true { 112 y = y + bonus 113 } 114 115 return 116 }