refactor(fight/effect): 重构效果触发机制,统一OnHit接口并优化伤害结算流程

This commit is contained in:
1
2025-09-24 18:53:54 +00:00
parent 266a328159
commit 29d485fde5
11 changed files with 195 additions and 125 deletions

View File

@@ -1,6 +1,7 @@
package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
@@ -16,12 +17,8 @@ func init() {
input.InitEffect(input.EffectType.Skill, 1, &Effect1{})
}
func (e *Effect1) OnHit(opp *input.Input, skill *info.SkillEntity) {
t := e.Input.GetEffect(input.EffectType.Damage, 0).Stack()
e.Input.CurrentPet.Info.Hp += uint32(t / 2)
// 重写POST_DAMAGE ,伤害结束后触发回血
func (this *Effect1) PostDamage() bool {
// off := this.GetSkill().DamageValue.Div(decimal.NewFromInt(2)) //伤害的一半
//this.GetOwnerPet().HP += int(off.IntPart()) //这里是effect在对方挂载,故回血给自己回血
//待重写实现
return true
}

View File

@@ -0,0 +1,50 @@
package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
type Effect10 struct {
node.EffectNode
Status info.EnumBattleStatus
}
func init() {
//n%令对方麻痹
input.InitEffect(input.EffectType.Skill, 10, &Effect10{
Status: info.BattleStatus.Paralysis,
})
// n%令对方中毒
input.InitEffect(input.EffectType.Skill, 11, &Effect10{
Status: info.BattleStatus.Poisoned,
})
//n%令对方烧伤
input.InitEffect(input.EffectType.Skill, 12, &Effect10{
Status: info.BattleStatus.Burned,
})
//n回合吸取对方最大体力的1/8(草系无效)
//n%令对方冻伤
input.InitEffect(input.EffectType.Skill, 12, &Effect10{
Status: info.BattleStatus.Frozen,
})
//n%令对方害怕
input.InitEffect(input.EffectType.Skill, 12, &Effect10{
Status: info.BattleStatus.Fear,
})
//n%令对手睡眠
input.InitEffect(input.EffectType.Skill, 12, &Effect10{
Status: info.BattleStatus.Sleep,
})
}
func (e *Effect10) OnHit(opp *input.Input, skill *info.SkillEntity) {
t, _, _ := e.Input.Player.Roll(e.EffectNode.SideEffectArgs[0], 100)
if t {
e.Input.AddEffect(input.Geteffect(input.EffectType.Status, int(e.Status)))
}
}

View File

@@ -1,6 +1,7 @@
package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
@@ -38,7 +39,7 @@ type EffectStat struct {
// addrA := unsafe.Pointer(baseAddr + 4) //根据攻击算其他字段
// *(*uint32)(addrA) = 100
// }
func (e *EffectStat) SkillUseEnd(opp *input.Input) {
func (e *EffectStat) OnHit(opp *input.Input, skill *info.SkillEntity) {
t, _, _ := e.Input.Player.Roll(e.EffectNode.SideEffectArgs[1], 100)
if t {

View File

@@ -1,6 +1,7 @@
package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
@@ -11,6 +12,7 @@ import (
type Effect62 struct {
node.EffectNode
Hide bool // 是否隐藏 正常是命中就可用,镇魂歌是回合数到才可用
Hit bool
}
func init() {
@@ -22,43 +24,40 @@ func init() {
}
func (this *Effect62) OnDamage() bool {
if this.Hide { //如果本可用
//直接秒杀对方
// 这个只会在我方命中时触发
func (e *Effect62) OnHit(opp *input.Input, skill *info.SkillEntity) {
if opp.UserID != e.Input.UserID { //说明是自身回合
e.Hit = true
}
return true
}
func (this *Effect62) TurnEnd(e *input.Input) {
this.EffectNode.TurnEnd(e) //先调用回合
if this.Duration(0) != 1 { //说明还没到生效节点
this.Hide = true //隐藏效果
func (e *Effect62) TurnEnd(opp *input.Input) {
e.EffectNode.TurnEnd(opp) //先调用回合
if e.Duration() != 1 { //说明还没到生效节点
e.Hide = true //隐藏效果
}
}
func (e *Effect62) SkillUseEnd(opp *input.Input) {
if !e.Hide { //如果还在隐藏,就直接返回
defer e.EffectNode.NotALive() //失效
if opp.UserID == e.Input.UserID && !e.Hide && e.Hit { //说明是自身回合//如果还在隐藏,就直接返回
//defer e.EffectNode.NotALive() //失效
//应该是对方固定伤害等于自身血量
//e.Input.Death() //本只死亡
//否则触发秒杀 在对面使用技能后
//return true
}
//否则触发秒杀 在对面使用技能后
//return true
}
// 默认添加回合
func (e *Effect62) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0])
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0]) //激活前无限挂载
}

View File

@@ -30,6 +30,7 @@ func (e *Effect0) TurnEnd(opp *input.Input) {
// 使用技能时
func (e *Effect0) OnSkill(opp *input.Input, skill *info.SkillEntity) {
//变威力作用
e.Stack(int(e.Input.CalculatePower(opp, skill).IntPart()))
e.Input.Exec(func(t input.Effect) bool { //计算暴击率加成
@@ -42,12 +43,6 @@ func (e *Effect0) OnSkill(opp *input.Input, skill *info.SkillEntity) {
e.Stack(e.Stack() * 2)
}
//这里注释掉,扣血在对方回合
if uint32(e.Input.AttackValue.LostHp) > opp.CurrentPet.Info.Hp {
opp.CurrentPet.Info.Hp = 0
} else {
opp.CurrentPet.Info.Hp = opp.CurrentPet.Info.Hp - e.Input.AttackValue.LostHp
}
}
func (this *Effect0) IsCrit(opp *input.Input, skill *info.SkillEntity) {
@@ -77,6 +72,18 @@ func (this *Effect0) IsCrit(opp *input.Input, skill *info.SkillEntity) {
}
}
// 受击触发
func (e *Effect0) AfterAttacked(opp *input.Input, skill *info.SkillEntity) {
if uint32(opp.AttackValue.LostHp) > e.Input.CurrentPet.Info.Hp {
//这里其实是受到致死伤害
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{})

View File

@@ -380,7 +380,7 @@ func (f *FightC) parseskill(attacker, defender *input.Input, id *SelectSkillActi
if t.Effect.GetOwner() { //如果取反,说明是给对方添加的回合效果
//实际上,owner永远为反,说明是对方给我添加的
t.Effect.SetArgs(attacker, temparg[:args]...) //设置入参,施加方永远是我方
attacker.AddEffect(t) //给双方添加
defender.AddEffect(t)
} else {
t.Effect.SetArgs(attacker, temparg[:args]...) //设置入参
@@ -416,18 +416,19 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *SelectSk
attacker.Exec(func(t input.Effect) bool { //计算命中
t.IsHit(defender, a.Skill) //相当于先调整基础命中
t.BeforHit(defender, a.Skill) //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
return attacker.AttackTime == 0 //等于0,继续处理
return true
})
defender.Exec(func(t input.Effect) bool { //计算闪避
t.TakeHit(attacker, a.Skill)
t.BeforHit(attacker, a.Skill)
return attacker.AttackTime > 0 //
return true
})
//这里施加miss
attacker.AttackValue.AttackTime = a.Skill.AttackTime
f.parseskill(attacker, defender, a) //是否miss都应该施加解析effect
if attacker.AttackValue.AttackTime > 0 { //如果命中
f.parseskill(attacker, defender, a) //命中后解析effect
attacker.Exec(func(t input.Effect) bool {
@@ -435,13 +436,25 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, a *SelectSk
return true
})
defender.Exec(func(t input.Effect) bool {
attacker.Exec(func(t input.Effect) bool {
t.SkillUseEnd(defender)
t.AfterAttacked(attacker, a.Skill) //红伤落实
return true
})
attacker.Exec(func(t input.Effect) bool {
t.OnHit(defender, a.Skill) //命中后结算
return true
})
attacker.Exec(func(t input.Effect) bool {
t.SkillUseEnd(defender) //技能使用完毕后结算
return true
})
// 扣减防御方血量
} //todo 处理未命中效果

View File

@@ -124,7 +124,8 @@ type WeakenedS struct {
// 定义战斗状态枚举
var BattleStatus = enum.New[struct {
Paralysis EnumBattleStatus `enum:"0"` // 麻痹
// 麻痹
Paralysis EnumBattleStatus `enum:"0"`
Poisoned EnumBattleStatus `enum:"1"` // 中毒
Burned EnumBattleStatus `enum:"2"` // 烧伤
DrainHP EnumBattleStatus `enum:"3"` // 吸取对方的体力

View File

@@ -19,22 +19,26 @@ type Effect interface {
// OnBeforeCalculateDamage() bool // 最终伤害计算前触发
// OnDamage() bool // 造成伤害时触发
//使用技能 可以取消用技能节点
AfterAttr(t *info.BattlePetEntity) //在获取属性前,比如重写对方属性AfterAttr
BeferAttr(t *info.BattlePetEntity) //在获取属性后,比如视为对方属性
SetArgs(input *Input,param ...int)
SetArgs(input *Input, param ...int)
IsCrit(opp *Input, skill *info.SkillEntity) //是否暴击
CalculateDamage(opp *Input, skill *info.SkillEntity) //击判定成功且伤害计算前触发
OnBeforeCalculateDamage(opp *Input, skill *info.SkillEntity) // 最终伤害计算前触发
OnSkill(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断
OnMiss(opp *Input, skill *info.SkillEntity) // 技能未命中时触发
BeforHit(opp *Input, skill *info.SkillEntity) // 技能命中前触发
OnHit(opp *Input, skill *info.SkillEntity) // 技能命中时触发
AfterHit(opp *Input, skill *info.SkillEntity) // 技能命中后触发
AfterAttacked(opp *Input, skill *info.SkillEntity) // 受击触发
// Shield() bool // 护盾值变化时触发
// PostDamage() bool // 伤害结算后触发(血量扣除后)
IsHit(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断
TakeHit(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断
//() bool // 暴击伤害结算后触发
OnSkill(opp *Input, skill *info.SkillEntity) //闪避率计算,,实际上是修改命中的判断
OnMiss() bool // 技能未命中时触发
// OnHit() bool // 技能命中时触发
// OnMiss() bool // 技能未命中时触发
// AfterAttacked() bool // 被攻击后触发(受击判定)
// SetOwner(bool)

View File

@@ -1,72 +0,0 @@
package node
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
)
// 技能命中计算
func (this *EffectNode) IsHit(opp *input.Input, skill *info.SkillEntity) {
}
// 被命中计算,默认直接返回,重写这个来实现闪避率
func (this *EffectNode) TakeHit(opp *input.Input, skill *info.SkillEntity) {
}
func (this *EffectNode) BeforeMultiHit() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) BeforeHit() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) OnBeforeCalculateDamage(opp *input.Input, skill *info.SkillEntity) {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) PreDamage() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) CalculateDamage(opp *input.Input, skill *info.SkillEntity) {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) OnDamage() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) Shield() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) PostDamage() bool {
panic("not implemented") // TODO: Implement
}
// 正常来说,什么都不做
func (this *EffectNode) IsCrit(opp *input.Input, skill *info.SkillEntity) {
//return skill.Crit
}
func (e *EffectNode) OnHit() bool {
panic("not implemented") // TODO: Implement
}
func (e *EffectNode) OnMiss() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) AfterAttacked() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) OnDefeat() bool {
panic("not implemented") // TODO: Implement
}

View File

@@ -1,6 +1,9 @@
package node
import "blazing/logic/service/fight/info"
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
)
// 返回false阻止继续运行
// 回合开始
@@ -14,4 +17,40 @@ func (this *EffectNode) BeferAttr(t *info.BattlePetEntity) {
}
//回合结束前
func (this *EffectNode) BeforeMultiHit() bool {
panic("not implemented") // TODO: Implement
}
// 回合结束前
func (this *EffectNode) OnBeforeCalculateDamage(opp *input.Input, skill *info.SkillEntity) {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) PreDamage() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) CalculateDamage(opp *input.Input, skill *info.SkillEntity) {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) OnDamage() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) Shield() bool {
panic("not implemented") // TODO: Implement
}
func (this *EffectNode) PostDamage() bool {
panic("not implemented") // TODO: Implement
}
// 正常来说,什么都不做
func (this *EffectNode) IsCrit(opp *input.Input, skill *info.SkillEntity) {
//return skill.Crit
}
func (this *EffectNode) OnDefeat() bool {
panic("not implemented") // TODO: Implement
}

View File

@@ -0,0 +1,31 @@
package node
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
)
// 命中前 攻击伤害结算
func (e *EffectNode) BeforHit(opp *input.Input, skill *info.SkillEntity) {
}
// 命中前 攻击伤害结算
func (e *EffectNode) AfterHit(opp *input.Input, skill *info.SkillEntity) {
}
// 命中时
func (e *EffectNode) OnHit(opp *input.Input, skill *info.SkillEntity) {
}
// miss触发
func (e *EffectNode) OnMiss(opp *input.Input, skill *info.SkillEntity) {
}
//受击触发
func (this *EffectNode) AfterAttacked(opp *input.Input, skill *info.SkillEntity) {
}