``` refactor(fight): 重构状态效果初始化逻辑,统一使用InitEffect方法并内置随机持续回合

This commit is contained in:
1
2025-12-11 19:12:54 +00:00
parent 8eb0a1324b
commit 5ca43fe21f
16 changed files with 42 additions and 72 deletions

View File

@@ -29,15 +29,11 @@ func (e *NewSel6) Action_end_ex() bool {
return true
}
duration := int(e.Input.FightC.GetRand().Int31n(2)) // 默认随机 2~3 回合
duration++
// 5. 获取状态效果实例并设置参数
statusEffect := input.Geteffect(input.EffectType.Status, int(e.Args()[0].IntPart()))
statusEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.Args()[0].IntPart()))
if statusEffect == nil {
return true
}
statusEffect.Duration(duration)
statusEffect.SetArgs(e.Ctx().Our) // 目标为对手
// 6. 给对手添加状态
//然后这里是被动添加,所以对方不能消除

View File

@@ -32,13 +32,11 @@ func (e *NewSel66) OnSkill() bool {
duration++
// 获取状态效果
eff := input.Geteffect(input.EffectType.Status, int(e.Args()[1].IntPart()))
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart()))
if eff == nil {
return true
}
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our) //输入参数是对方
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
return true
}

View File

@@ -32,13 +32,11 @@ func (e *NewSel67) OnSkill() bool {
duration++
// 获取状态效果
eff := input.Geteffect(input.EffectType.Status, int(e.Args()[1].IntPart()))
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart()))
if eff == nil {
return true
}
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our) //输入参数是对方
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
return true
}

View File

@@ -150,10 +150,9 @@ func (e *EffectDefeatTrigger) triggerNextEnemyStatusOnDefeat(at info.AttackValue
// 简化示例:直接处理状态施加
for i, v := range at.Status {
if v > 0 {
nv := input.Geteffect(input.EffectType.Status, int(i))
nv := e.Ctx().Our.InitEffect(input.EffectType.Status, int(i))
if nv != nil {
nv.Duration(int(e.Input.FightC.GetRand().Int31n(2)))
nv.SetArgs(e.Ctx().Our) //输入参数是对方
e.Ctx().Opp.AddEffect(e.Ctx().Our, nv)
}
}

View File

@@ -64,16 +64,11 @@ func (e *EffectPhysicalAttackAddStatus) Skill_Use_ex() bool {
return true
}
// 4. 计算持续回合默认2~3回合支持通过参数指定
duration := e.getDuration()
// 5. 获取状态效果实例并设置参数
statusEffect := input.Geteffect(input.EffectType.Status, int(e.targetStatus))
statusEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.targetStatus))
if statusEffect == nil {
return true
}
statusEffect.Duration(duration)
statusEffect.SetArgs(e.Ctx().Our) // 目标为对手
// 6. 给对手添加状态
e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEffect)
@@ -85,10 +80,3 @@ func (e *EffectPhysicalAttackAddStatus) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0])
}
// 计算持续回合(封装为独立方法,增强可读性)
func (e *EffectPhysicalAttackAddStatus) getDuration() int {
// 默认随机2~3回合Int31n(2)返回0/1+2后为2/3
return int(e.Input.FightC.GetRand().Int31n(2)) + 2
}

View File

@@ -15,10 +15,11 @@ type Effect1 struct {
node.EffectNode
}
func initskill(id int, e input.Effect) {
input.InitEffect(input.EffectType.Skill, id, e)
}
func init() {
ret := &Effect1{}
input.InitEffect(input.EffectType.Skill, 1, ret)
initskill(1, &Effect1{})
}

View File

@@ -68,13 +68,11 @@ func (e *Effect104) OnSkill() bool {
duration++
// 获取状态效果
eff := input.Geteffect(input.EffectType.Status, int(e.Status))
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.Status))
if eff == nil {
return true
}
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our) //输入参数是对方
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
return true
}

View File

@@ -32,16 +32,14 @@ func (e *Effect13) OnSkill() bool {
if gconv.Int(e.Ctx().Opp.CurrentPet.PetInfo.Type) == int(element.ElementTypeGrass) {
return true
}
duration := e.EffectNode.SideEffectArgs[0] - 1
//duration++
// 获取状态效果
eff := input.Geteffect(input.EffectType.Status, int(info.PetStatus.DrainedHP))
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(info.PetStatus.DrainedHP))
if eff == nil {
return true
}
eff.Duration(e.EffectNode.SideEffectArgs[0] - 1)
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our)
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
return true
}

View File

@@ -38,13 +38,11 @@ func (e *Effect1605) OnSkill() bool {
duration++
// 获取状态效果
eff := input.Geteffect(input.EffectType.Status, int(e.SideEffectArgs[1]))
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.SideEffectArgs[1]))
if eff == nil {
return true
}
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our) //输入参数是对方
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
return true
}

View File

@@ -25,7 +25,7 @@ func (e *Effect20) OnSkill() bool {
if !ok {
return true
}
t := input.Geteffect(input.EffectType.Status, int(info.PetStatus.Tired))
t := e.Ctx().Our.InitEffect(input.EffectType.Status, int(info.PetStatus.Tired))
t.Duration(e.SideEffectArgs[1])
e.Ctx().Our.AddEffect(e.Ctx().Our, t)
return true

View File

@@ -10,10 +10,9 @@ import (
// 注册
// -----------------------------------------------------------
func init() {
// 自身能力变化
input.InitEffect(input.EffectType.Skill, 4, newEffectStat(false))
// 对方能力变化
input.InitEffect(input.EffectType.Skill, 5, newEffectStat(true))
initskill(4, newEffectStat(false))
initskill(5, newEffectStat(true))
}
// -----------------------------------------------------------

View File

@@ -49,15 +49,11 @@ func (e *EffectRandomStatus) OnSkill() bool {
}
// 获取状态效果并设置参数
eff := input.Geteffect(input.EffectType.Status, int(targetStatus))
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(targetStatus))
if eff == nil {
return true
}
// 持续时间随机2-3回合与原逻辑一致
duration := int(e.Input.FightC.GetRand().Int31n(2)) + 2
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our)
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
return true

View File

@@ -1,7 +1,6 @@
package effect
import (
"blazing/common/utils"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
@@ -26,8 +25,8 @@ type Effect8 struct {
// DamageFloor 伤害落实前触发,限制最大伤害
func (e *Effect8) DamageFloor(t *info.DamageZone) bool {
if t.Type == info.DamageType.Red {
t.Damage = alpacadecimal.NewFromInt(utils.Min(t.Damage.IntPart(),
int64(e.Ctx().Opp.CurrentPet.Info.Hp)-1))
t.Damage = alpacadecimal.Min(t.Damage, e.Ctx().Opp.CurrentPet.GetHP().Sub(alpacadecimal.NewFromInt(1)))
e.max = t.Damage
}

View File

@@ -136,13 +136,11 @@ func (e *Flammable) Skill_Use_ex() bool {
return true
}
// 获取状态效果
eff := input.Geteffect(input.EffectType.Status, info.PetStatus.Burned)
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(info.PetStatus.Burned))
if eff == nil {
return true
}
duration := int(e.Input.FightC.GetRand().Int31n(2)) // 默认随机 2~3 回合
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our) //输入参数是对方
e.Ctx().Our.AddEffect(e.Ctx().Our, eff)
return true

View File

@@ -63,26 +63,22 @@ func (e *Effect10) OnSkill() bool {
if !success {
return true
}
var duration int
if len(e.EffectNode.SideEffectArgs) > 1 {
// 持续回合
duration = e.EffectNode.SideEffectArgs[1]
}
// 持续回合
if duration == 0 {
duration = int(e.Input.FightC.GetRand().Int31n(2)) // 默认随机 2~3 回合
duration++
}
// 获取状态效果
eff := input.Geteffect(input.EffectType.Status, int(e.Status))
eff := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.Status))
if eff == nil {
return true
}
eff.Duration(duration)
eff.SetArgs(e.Ctx().Our) //输入参数是对方
if len(e.EffectNode.SideEffectArgs) > 1 {
// 持续回合
eff.Duration(e.EffectNode.SideEffectArgs[1])
}
e.Ctx().Opp.AddEffect(e.Ctx().Our, eff)
return true
}

View File

@@ -11,6 +11,7 @@ import (
"github.com/alpacahq/alpacadecimal"
"github.com/brunoga/deep"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/grand"
"github.com/tnnmigga/enum"
)
@@ -72,6 +73,7 @@ func Geteffect[T int | byte | uint16](etype EnumEffectType, id T) Effect {
if etype == EffectType.Status {
eff.CanStack(true) //状态类不能被覆盖,只能无限叠加
eff.Duration(grand.N(1, 2))
}
@@ -80,6 +82,12 @@ func Geteffect[T int | byte | uint16](etype EnumEffectType, id T) Effect {
}
return nil
}
func (our *Input) InitEffect(etype EnumEffectType, id int) Effect {
ret := Geteffect(etype, id)
ret.SetArgs(our) //输入参数是对方
return ret
}
// * battle_lv: atk(0), def(1), sp_atk(2), sp_def(3), spd(4), accuracy(5)
// 是否需要真实提升