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:
177
logic/service/fight/effect/EffectDefeatTrigger.go
Normal file
177
logic/service/fight/effect/EffectDefeatTrigger.go
Normal 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) {
|
||||
// 计算恢复量:自身最大体力 / n(n=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) {
|
||||
// 计算伤害量:对方下只精灵最大体力 / n(n=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)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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])
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
}
|
||||
29
logic/service/fight/effect/effect_87.go
Normal file
29
logic/service/fight/effect/effect_87.go
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user