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  }