refactor(fight/effect): 重构效果触发机制,统一OnHit接口并优化伤害结算流程
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
50
logic/service/fight/effect/effect_10-16.go
Normal file
50
logic/service/fight/effect/effect_10-16.go
Normal 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)))
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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]) //激活前无限挂载
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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{})
|
||||
|
||||
|
||||
@@ -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 处理未命中效果
|
||||
|
||||
|
||||
@@ -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"` // 吸取对方的体力
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
31
logic/service/fight/node/hit.go
Normal file
31
logic/service/fight/node/hit.go
Normal 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) {
|
||||
}
|
||||
Reference in New Issue
Block a user