Files
bl/logic/service/fight/input/attr.go

112 lines
2.7 KiB
Go
Raw Normal View History

package input
import (
element "blazing/common/data/Element"
"blazing/logic/service/fight/info"
"github.com/mohae/deepcopy"
"github.com/shopspring/decimal"
)
func (u *Input) Death() {
u.CurrentPet.Info.Hp = 0
//todo 待实现死亡effet
}
// 1是添加-1是减少0是清除
func (u *Input) SetProp(prop, level int) {
if level == 0 { //说明是消强
//todo 消强交互
}
//todo 待交互
u.AttackValue.Prop[prop] = u.AttackValue.Prop[prop] + int8(level)
//todo 待交互
}
func (i *Input) GetAction(opp *Input) {
//使用1#技能,实际上要按照四个技能权重去使用
i.FightC.UseSkill(i.Player, int32(i.FightC.GetCurrPET(i.Player).Skills[0].ID))
}
// todo获取属性待实现获取后改回原属性
func (i *Input) GetProp(f func()) {
oldour := deepcopy.Copy(i.CurrentPet).(*info.BattlePetEntity)
//oldouo := deepcopy.Copy(opp.CurrentPet).(*info.BattlePetEntity)
i.Exec(func(t Effect) bool { //属性获取前
t.BeferAttr(i.CurrentPet) //使XX为XX
return true
})
// if in.UserID != i.UserID {
// in.Exec(func(t input.Effect) bool { //属性获取后
// t.AfterAttr(i.CurrentPet) //视为xx
// return true
// })
// }
f()
i.CurrentPet = oldour //恢复
//opp.CurrentPet = oldouo //恢复
}
// 计算技能威力
func (i *Input) CalculatePower(deftype *info.BattlePetEntity, skill *info.SkillEntity) decimal.Decimal {
//威力+区
//威力*区
//todo 待修复input输入
// 1. 计算等级因子 (level * 0.4 + 2)
levelFactor := decimal.NewFromInt(int64(i.CurrentPet.Info.Level)).
Mul(decimal.NewFromFloat(0.4)).Add(decimal.NewFromInt(2))
var (
attackDec decimal.Decimal //攻击值
defenseDec decimal.Decimal //防御值
)
switch skill.Category() { //判断技能类型
case info.Category.PHYSICAL:
attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[0]))
defenseDec = decimal.NewFromInt(int64(deftype.Info.Prop[1]))
case info.Category.SPECIAL:
attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[2]))
defenseDec = decimal.NewFromInt(int64(deftype.Info.Prop[3]))
default:
return decimal.NewFromInt(0)
}
// 5. 基础伤害公式:等级因子 * 威力因子 * 攻击 / 防御 / 50 + 2
baseDamage := levelFactor.
Mul(decimal.NewFromInt(int64(skill.Power))).
Mul(attackDec).
Div(defenseDec).
Div(decimal.NewFromInt(50)).
Add(decimal.NewFromInt(2))
t, _ := element.NewElementCalculator().GetOffensiveMultiplier(skill.Type().ID, deftype.Type().ID)
typeRate := decimal.NewFromFloat(t)
damage := baseDamage.
Mul(skill.CriticalsameTypeBonus()). // 同属性加成
Mul(typeRate). // 克制系数
Mul(skill.Criticalrandom()) //随机波动
return damage
}