Files
bl/logic/service/fight/effect/effect_damage.go

122 lines
2.8 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 effect
import (
"blazing/common/utils"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
// 施加一个基类effect
type Effect0 struct {
node.EffectNode
}
func (e *Effect0) TurnEnd(opp *input.Input) {
e.Input.AttackValue.RemainHp = int32(e.Input.CurrentPet.Info.Hp)
}
// 使用技能时
func (e *Effect0) OnSkill(opp *input.Input, skill *info.SkillEntity) {
e.Input.Skill(skill, func() { //变威力作用
e.Stack(int(e.Input.CalculatePower(opp, skill).IntPart()))
})
e.Input.Exec(func(t input.Effect) bool { //计算暴击率加成
e.Input.AttackValue.IsCritical = skill.Crit
return e.Input.AttackValue.IsCritical == 0
})
if e.Input.AttackValue.IsCritical == 1 {
e.Input.Exec(func(t input.Effect) bool { //加伤
t.AddZone(e.Input, &input.EffectID{
ID: 1,
Effect: e,
})
return true
})
e.Input.Exec(func(t input.Effect) bool { //乘伤
t.MulZone(e.Input, &input.EffectID{
ID: 1,
Effect: e,
})
return true
})
e.Stack(e.Stack() * 2)
if e.MaxStack != 0 && e.Stack() > e.MaxStack { //限制最大伤害
e.Stack(e.MaxStack)
}
}
}
func (this *Effect0) BeforHit(opp *input.Input, skill *info.SkillEntity) {
skill.AttackTimeC(int(opp.GetProp(5, true))) //计算命中
skill.Crit = 0
CritRate := utils.Max(skill.CritRate, 1)
//CritAtkFirst: 先出手时必定致命一击; 默认: 0
if skill.CritAtkFirst != 0 && this.Input.First {
CritRate = 16
}
//CritAtkSecond: 后出手时必定致命一击; 默认: 0
if skill.CritAtkSecond != 0 && !this.Input.First {
CritRate = 16
}
// CritSelfHalfHp: 自身体力低于一半时必定致命一击; 默认: 0
if skill.CritSelfHalfHp != 0 && (this.Input.CurrentPet.HP < int(this.Input.CurrentPet.Info.MaxHp)/2) {
CritRate = 16
}
// CritFoeHalfHp: 对方体力低于一半时必定致命一击; 默认: 0
if skill.CritSelfHalfHp != 0 && (opp.CurrentPet.HP < int(opp.CurrentPet.Info.MaxHp)/2) {
CritRate = 16
}
//todo 暴击伤害
if t, _, _ := this.Input.Player.Roll(625*CritRate, 10000); t {
skill.Crit = 1
}
}
// 受击触发
func (e *Effect0) AfterAttacked(opp *input.Input, skill *info.SkillEntity) {
e.Input.Exec(func(t input.Effect) bool { //加伤
t.AddZone(opp, &input.EffectID{
ID: 1,
Effect: e,
})
return true
})
e.Input.Exec(func(t input.Effect) bool { //乘伤
t.MulZone(opp, &input.EffectID{
ID: 1,
Effect: e,
})
return true
})
//在这里修改伤害
if uint32(opp.AttackValue.LostHp) > e.Input.CurrentPet.Info.Hp {
//这里其实是受到致死伤害
//然后先触发死亡效果消除所有buff
//然后触发回神效果
e.Input.CurrentPet.Info.Hp = 0
} else {
e.Input.CurrentPet.Info.Hp = e.Input.CurrentPet.Info.Hp - opp.AttackValue.LostHp
}
}
func init() {
input.InitEffect(input.EffectType.Damage, 0, &Effect0{})
}