feat(fight): 移除无用代码并优化技能效果逻辑

- 删除了多个未使用的技能效果文件(effect_10-16_94_99_14.go、effect_61_70_118.go、
  effect_66.go、effect_67.go、effect_78_86_106.go、effect_84_92.go、prop.go)
- 修正了部分技能效果中的错误逻辑判断和数值计算方式
- 调整了伤害计算与治疗效果的参数使用顺序,使其符合预期行为
- 注释掉调试打印语句及测试调用,减少冗余输出
- 修复了部分效果中对技能分类的错误比较条件

此次修改提升了战斗系统代码的整洁性和准确性。
This commit is contained in:
2025-11-14 02:04:19 +08:00
parent 3c067751f1
commit f224bef17a
19 changed files with 231 additions and 150 deletions

View File

@@ -0,0 +1,177 @@
package effect
import (
"blazing/logic/service/fight/action"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/shopspring/decimal"
)
// -----------------------------------------------------------
// 通用效果:当次攻击击败对方精灵时,触发指定行为
// -----------------------------------------------------------
// 回调函数:击败对方后执行的具体行为
type defeatTriggerFunc func(e *EffectDefeatTrigger, AttackValue info.AttackValue)
type EffectDefeatTrigger struct {
node.EffectNode
can bool // 标记技能是否生效(当次攻击有效)
triggerFunc defeatTriggerFunc // 差异化:击败后的行为
}
// 工厂函数:创建"击败触发"效果实例,传入具体行为回调
func newEffectDefeatTrigger(trigger defeatTriggerFunc) *EffectDefeatTrigger {
return &EffectDefeatTrigger{
triggerFunc: trigger,
}
}
// 初始化:批量注册所有"击败触发"类效果
func init() {
registerDefeatTriggerEffects()
}
// 批量注册绑定效果ID与对应的触发行为
func registerDefeatTriggerEffects() {
effectMap := map[int]defeatTriggerFunc{
66: triggerHealSelfOnDefeat, // Effect66击败后恢复自身最大体力1/n
67: triggerReduceNextHPOnDefeat, // Effect67击败后减少对方下只精灵最大体力1/n
158: triggerLevelUpOnDefeat,
185: triggerNextEnemyStatusOnDefeat,
421: triggerTransferBoostsOnDefeat,
}
for effectID, trigger := range effectMap {
input.InitEffect(input.EffectType.Skill, effectID, newEffectDefeatTrigger(trigger))
}
}
// -----------------------------------------------------------
// 共性逻辑OnSkill标记生效Switch检查条件并触发行为
// -----------------------------------------------------------
// OnSkill命中时标记当次攻击可触发效果
func (e *EffectDefeatTrigger) OnSkill() bool {
if !e.Hit() {
return true
}
e.can = true // 标记当次攻击有效
return true
}
// Switch检查是否击败对方满足条件则触发行为
func (e *EffectDefeatTrigger) Switch(in *input.Input, at info.AttackValue, oldpet *info.BattlePetEntity) bool {
// 1. 检查效果是否生效(当次攻击有效)
if !e.can {
return true
}
// 2. 过滤我方切精灵的情况(只处理对方切精灵)
if in == e.Ctx().Our {
return true
}
// 3. 检查对方上一只精灵是否被击败(触发条件)
if oldpet.NotAlive {
e.triggerFunc(e, at) // 调用差异化行为
}
return true
}
// SetArgs统一设置持续时间为1回合与原逻辑一致
func (e *EffectDefeatTrigger) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(1)
}
// -----------------------------------------------------------
// 差异化行为实现(回调函数)
// -----------------------------------------------------------
// triggerHealSelfOnDefeat击败对方后恢复自身最大体力的1/n对应Effect66
func triggerHealSelfOnDefeat(e *EffectDefeatTrigger, at info.AttackValue) {
// 计算恢复量:自身最大体力 / nn=SideEffectArgs[0]
maxHP := e.Ctx().Our.CurrentPet.Info.MaxHp
healAmount := decimal.NewFromInt(int64(maxHP)).Div(decimal.NewFromInt(int64(e.SideEffectArgs[0])))
// 执行回血复用原逻辑的Heal方法
e.Ctx().Our.Heal(e.Ctx().Our, &action.SelectSkillAction{}, healAmount)
}
// triggerReduceNextHPOnDefeat击败对方后减少对方下次出战精灵最大体力的1/n对应Effect67
func triggerReduceNextHPOnDefeat(e *EffectDefeatTrigger, at info.AttackValue) {
// 计算伤害量:对方下只精灵最大体力 / nn=SideEffectArgs[0]
nextMaxHP := e.Ctx().Opp.CurrentPet.Info.MaxHp // 假设CurrentPet为下次出战精灵
damageAmount := decimal.NewFromInt(int64(nextMaxHP)).Div(decimal.NewFromInt(int64(e.SideEffectArgs[0])))
// 执行伤害复用原逻辑的Damage方法
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Fixed,
Damage: damageAmount,
})
}
// -----------------------------------------------------------
// 差异化行为triggerLevelUpOnDefeat击败后m%概率提升自身XX等级+n
// -----------------------------------------------------------
// 假设参数定义:
// SideEffectArgs[0] = m触发概率如30=30%
// SideEffectArgs[1] = XX等级类型如1=攻击等级2=防御等级对应info.LevelType枚举
// SideEffectArgs[2] = n提升的等级值如1=+1级
func triggerLevelUpOnDefeat(e *EffectDefeatTrigger, at info.AttackValue) {
// 1. 检查参数是否足够(至少需要概率、等级类型、提升值)
if len(e.SideEffectArgs) < 3 {
return // 参数不足,不触发
}
// 2. 概率判定m% = SideEffectArgs[0]
m := e.SideEffectArgs[0]
success, _, _ := e.Input.Player.Roll(m, 100)
if !success {
return // 概率判定失败,不触发
}
e.Ctx().Our.SetProp(e.Ctx().Our, int8(e.Args()[1]), int8(e.Args()[2]), info.AbilityOpType.ADD)
// (可选)添加日志:记录等级提升
// log.Printf("击败对手后触发等级提升:%s等级+%d概率%d%%成功)", levelType, n, m)
}
// -----------------------------------------------------------
// 核心逻辑triggerNextEnemyStatusOnDefeat
// 触发条件1. 击败对手2. 被击败的对手是XX类型
// 触发行为下一个出场的对手进入XX状态持续指定回合
// -----------------------------------------------------------
// 参数定义通过SideEffectArgs传递
// SideEffectArgs[0] = 目标对手类型XX类型如info.PetType.Fire表示火系
// SideEffectArgs[1] = 要施加的状态XX状态如info.PetStatus.Burned表示烧伤
// SideEffectArgs[2] = 状态持续回合如3表示持续3回合
func triggerNextEnemyStatusOnDefeat(e *EffectDefeatTrigger, at info.AttackValue) {
for _, v := range at.Status {
if v > 0 {
nv := input.Geteffect(input.EffectType.Status, int(v))
if nv != nil {
e.Ctx().Opp.AddEffect(nv)
}
}
}
}
// -----------------------------------------------------------
// 核心逻辑triggerTransferBoostsOnDefeat
// 触发行为:获取被击败对手的所有能力提升效果,复制到自身
// -----------------------------------------------------------
// 假设能力提升通过`BattlePetEntity.Boosts`存储(键为能力类型,值为提升等级)
// 例如Boosts = map[info.LevelType]int{info.Attack: 2, info.Defense: 1} 表示攻击+2、防御+1
func triggerTransferBoostsOnDefeat(e *EffectDefeatTrigger, at info.AttackValue) {
for i, v := range at.Prop {
if v > 0 {
e.Ctx().Our.SetProp(e.Ctx().Our, int8(i), v, info.AbilityOpType.COPY)
}
}
}

View File

@@ -27,9 +27,6 @@ func (e *Effect100) Skill_Hit() bool {
return true
}
if e.Ctx().SkillEntity.Category() == info.Category.PHYSICAL {
return true
}
//技能威力=【165-65*【当前体力百分比】】,任意体力百分比对应的威力浮动范围∈[-10+10]
odp := e.GetInput().CurrentPet.GetHP().Div(e.GetInput().CurrentPet.GetMaxHP()).Mul(decimal.NewFromInt(65))

View File

@@ -28,7 +28,7 @@ func (e *Effect101) OnSkill() bool {
}
e.Input.Heal(
e.Ctx().Our, &action.SelectSkillAction{}, e.Ctx().Our.DamageZone.Damage.Div(decimal.NewFromInt(int64(e.Args()[0]))),
e.Ctx().Our, &action.SelectSkillAction{}, e.Ctx().Our.DamageZone.Damage.Mul(decimal.NewFromInt(int64(e.Args()[0])).Div(decimal.NewFromInt(100))),
)
return true
}

View File

@@ -26,12 +26,9 @@ func (e *Effect113) Skill_Hit() bool {
return true
}
if e.Ctx().SkillEntity.Category() == info.Category.PHYSICAL {
return true
}
//技能威力=【165-65*【当前体力百分比】】,任意体力百分比对应的威力浮动范围∈[-10+10]
e.Ctx().SkillEntity.Power = int(26 + e.Ctx().Our.CurrentPet.Info.Dv*4)
e.Ctx().SkillEntity.Power = int(e.Ctx().Our.CurrentPet.Info.Dv * 5)
return true
}

View File

@@ -32,7 +32,7 @@ func (e *Effect34) OnSkill() bool {
}
// 被攻击时候反弹
func (e *Effect34) Skill_Use_ex() bool {
func (e *Effect34) Skill_Useed() bool {
if !e.can {
return true
@@ -42,15 +42,10 @@ func (e *Effect34) Skill_Use_ex() bool {
return true
}
// //0血不触发
// if e.Input.CurrentPet.Info.Hp <= 0 {
// return true
// }
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Fixed,
Damage: decimal.NewFromInt(int64(e.Ctx().Opp.DamageZone.Damage.IntPart())).Sub(decimal.NewFromInt(int64(e.SideEffectArgs[0]))),
Damage: decimal.NewFromInt(int64(e.Ctx().Opp.DamageZone.Damage.IntPart())).Mul(decimal.NewFromInt(int64(e.SideEffectArgs[0]))),
})
return true
}

View File

@@ -31,7 +31,7 @@ func (e *Effect41) Damage_DIV_ex(t *info.DamageZone) bool {
if e.Ctx().SkillEntity == nil {
return true
}
if e.Ctx().SkillEntity.Category() != info.Category.STATUS {
if e.Ctx().SkillEntity.Category() == info.Category.STATUS {
return true
}
if e.Ctx().SkillEntity.Type().Secondary != nil {

View File

@@ -27,7 +27,7 @@ func (e *Effect6) Skill_Useed() bool {
e.Ctx().Our.Damage(e.Ctx().Our, &info.DamageZone{
//这个对面计算前是在他的回合,所以后手也能拿到伤害
Damage: e.Ctx().Opp.DamageZone.Damage.Div(decimal.NewFromInt(int64(e.SideEffectArgs[0]))),
Damage: e.Ctx().Our.DamageZone.Damage.Div(decimal.NewFromInt(int64(e.SideEffectArgs[0]))),
})
return true

View File

@@ -27,7 +27,7 @@ type Effect60 struct {
func (e *Effect60) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0])
e.EffectNode.Duration(e.SideEffectArgs[0])
}
func (e *Effect60) OnSkill() bool {
@@ -36,7 +36,6 @@ func (e *Effect60) OnSkill() bool {
}
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Fixed,
Damage: decimal.NewFromInt(int64(e.Ctx().Opp.CurrentPet.Info.Hp)).Div(decimal.NewFromInt(int64(e.SideEffectArgs[1]))),
})
Damage: decimal.NewFromInt(int64(e.SideEffectArgs[1]))})
return true
}

View File

@@ -26,20 +26,23 @@ func (e *Effect65) Skill_Hit() bool {
return true
}
if e.Ctx().SkillEntity.Category() == info.Category.PHYSICAL {
return true
}
if e.Ctx().SkillEntity.Category() != info.EnumCategory(e.Args()[0]) {
if e.Ctx().SkillEntity.Category() != info.EnumCategory(e.Args()[1]) {
return true
}
//技能威力=【165-65*【当前体力百分比】】,任意体力百分比对应的威力浮动范围∈[-10+10]
e.Ctx().SkillEntity.Power *= e.Args()[1]
e.Ctx().SkillEntity.Power *= e.Args()[2]
return true
}
// ---- 注册所有效果 ----
func init() {
input.InitEffect(input.EffectType.Skill, 113, &Effect65{})
input.InitEffect(input.EffectType.Skill, 65, &Effect65{})
}
func (e *Effect65) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0])
}

View File

@@ -1,56 +0,0 @@
package effect
import (
"blazing/logic/service/fight/action"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/shopspring/decimal"
)
/**
* 当次攻击击败对方出战精灵时恢复自身最大体力的1/n
*/
type Effect66 struct {
node.EffectNode
can bool
}
func init() {
input.InitEffect(input.EffectType.Skill, 66, &Effect66{})
}
func (e *Effect66) OnSkill() bool {
if !e.Hit() {
return true
}
e.can = true
return true
}
// 重写死亡,如果击败,就出触发死亡事件,判断是目标精灵
func (e *Effect66) Switch(in *input.Input, at info.AttackValue, outpet *info.BattlePetEntity) bool {
//技能效果还没生效
if !e.can {
return true
}
//如果是我方切精灵
if in == e.Ctx().Our {
return true
}
if outpet.NotAlive { //如果上一只已经死亡后切换的,对对手直接施加扣血
e.Ctx().Our.Heal(e.Ctx().Our, &action.SelectSkillAction{}, decimal.NewFromInt(int64(e.SideEffectArgs[0])))
}
return true
}
func (e *Effect66) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(1)
}

View File

@@ -1,59 +0,0 @@
package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"github.com/shopspring/decimal"
)
/**
* 当次攻击击败对方时减少对方下次出战精灵的最大体力1/n
*/
type Effect67 struct {
node.EffectNode
can bool
}
func init() {
t := &Effect67{}
input.InitEffect(input.EffectType.Skill, 67, t)
}
func (e *Effect67) OnSkill() bool {
if !e.Hit() {
return true
}
e.can = true
return true
}
// 重写死亡,如果击败,就出触发死亡事件,判断是目标精灵
func (e *Effect67) Switch(in *input.Input, at info.AttackValue, outpet *info.BattlePetEntity) bool {
//技能效果还没生效
if !e.can {
return true
}
//如果是我方切精灵
if in == e.Ctx().Our {
return true
}
if outpet.NotAlive { //如果上一只已经死亡后切换的,对对手直接施加扣血
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Fixed,
Damage: decimal.NewFromInt(int64(e.Ctx().Opp.CurrentPet.Info.MaxHp)).Div(decimal.NewFromInt(int64(e.SideEffectArgs[0]))),
})
}
return true
}
func (e *Effect67) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(1)
}

View File

@@ -0,0 +1,29 @@
package effect
import (
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"math"
)
/**
* 恢复自身所有PP值
*/
func init() {
input.InitEffect(input.EffectType.Skill, 87, &Effect87{})
}
type Effect87 struct {
node.EffectNode
}
func (e *Effect87) OnSkill() bool {
if !e.Hit() {
return true
}
e.Ctx().Our.HealPP(math.MaxInt)
return true
}

View File

@@ -215,9 +215,9 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
currentskill = oldskill
//attacker.Initeffectcache()
// fmt.Println("开始攻击威力", oldskill.Power)
if oldskill != nil {
fmt.Println("开始攻击威力", oldskill.Power)
}
// if oldskill != nil {
// fmt.Println("开始攻击威力", oldskill.Power)
// }
//是否miss都应该施加解析effect
canuseskill := attacker.Exec(func(t input.Effect) bool { //这个是能否使用技能
@@ -236,10 +236,10 @@ func (f *FightC) enterturn(fattack, sattack *action.SelectSkillAction) {
f.processSkillAttack(attacker, defender, currentskill)
currentskill = oldskill //还原技能
if oldskill != nil {
fmt.Println("结束攻击_old", oldskill.Power)
fmt.Println("结束攻击_new", currentskill.Power)
}
// if oldskill != nil {
// fmt.Println("结束攻击_old", oldskill.Power)
// fmt.Println("结束攻击_new", currentskill.Power)
// }
_, skill, ok := utils.FindWithIndex(attacker.CurrentPet.Info.SkillList, func(item model.SkillInfo) bool {
return item.ID == currentskill.Info.ID

View File

@@ -3,7 +3,6 @@ package main
import (
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
element "blazing/common/data/Element"
_ "blazing/contrib/drivers/pgsql"
_ "blazing/contrib/files/local"
@@ -26,7 +25,7 @@ import (
)
func main() {
element.TestAllScenarios()
// element.TestAllScenarios()
//service.TestSendVerificationCode()
cmd.Main.Run(gctx.New())
}