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

138 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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) Prop(in *Input, 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
})
oldourr := deepcopy.Copy(in.CurrentPet).(*info.BattlePetEntity)
in.Exec(func(t Effect) bool { //属性获取后
t.AfterAttr(i.CurrentPet) //视为xx 需要在里面判断来源
return true
})
f()
in.CurrentPet = oldourr
i.CurrentPet = oldour //恢复
//opp.CurrentPet = oldouo //恢复
}
func (i *Input) Skill(in *info.SkillEntity, f func()) {
oldour := deepcopy.Copy(i.CurrentPet).(*info.SkillEntity)
//oldouo := deepcopy.Copy(opp.CurrentPet).(*info.BattlePetEntity)
i.Exec(func(t Effect) bool { //属性获取前
t.BeforeSkill(i,in) //使XX为XX
return true
})
in = oldour //恢复
}
// 计算技能威力
func (i *Input) CalculatePower(deftype *Input, skill *info.SkillEntity) decimal.Decimal {
// 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:
i.Prop(i, func() { //我方取我方攻击
attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[0]))
})
deftype.Prop(i, func() { //我方取敌方防御
defenseDec = decimal.NewFromInt(int64(deftype.CurrentPet.Info.Prop[1]))
})
case info.Category.SPECIAL:
i.Prop(i, func() { //我方取我方攻击
attackDec = decimal.NewFromInt(int64(i.CurrentPet.Info.Prop[2]))
})
deftype.Prop(i, func() { //我方取敌方防御
defenseDec = decimal.NewFromInt(int64(deftype.CurrentPet.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))
var typeRate decimal.Decimal
deftype.Prop(i, func() { //我方取敌方属性,得到敌方的实际和我方的视为
t, _ := element.NewElementCalculator().GetOffensiveMultiplier(skill.Type().ID, deftype.CurrentPet.Type().ID)
typeRate = decimal.NewFromFloat(t)
})
damage := baseDamage.
Mul(skill.CriticalsameTypeBonus()). // 同属性加成
Mul(typeRate). // 克制系数
Mul(skill.Criticalrandom()) //随机波动
return damage
}