Files
bl/logic/service/fight/effect/effect_38.go
昔念 0ea1a24419 feat(fight): 实现 boss 战斗中精灵特性的支持与多个新魂印效果
- 在 `fight_boss.go` 中为 Boss 的每只宠物增加了 CatchTime 字段以区分不同精灵,
  并修复了技能特效参数解析的问题。
- 新增多个魂印(NewSeIdx)实现,包括:
  * 无限 PP、伤害倍率控制、命中屏蔽、属性克制、暴击率调整等。
- 调整了部分已有 NewSeIdx 文件中的方法调用方式,统一使用 `ID().GetCatchTime()`
  来判断精灵是否在场。
- 修改了 EffectIDCombiner 的字段访问方式,改为通过 Get/Set 方法操作。
- 优化战斗逻辑,在 NPC 战斗中加入 AI 自动出招机制。
2025-11-26 15:25:10 +08:00

76 lines
1.5 KiB
Go

package effect
import (
"blazing/logic/service/fight/action"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
"sync"
)
/**
* 降低对方 n 点 btl_Max体力
*/
type Effect38 struct {
node.EffectNode
}
func (e *Effect38) OnSkill() bool {
if !e.Hit() {
return true
}
ee := &Effect38_sub{}
ee.EffectNode.Duration(-1) //给对方挂3回合子buff
//ee.ID(e.ID() + int(input.EffectType.Sub)) //子效果ID
tt := e.ID()
tt.SetEffectType(input.EffectType.Sub)
ee.ID(tt)
ee.SetArgs(e.Ctx().Our, e.SideEffectArgs...)
e.Ctx().Opp.AddEffect(e.Ctx().Our, ee)
return true
}
// 命中之后
func (e *Effect38_sub) Turn_Start(fattack *action.SelectSkillAction, sattack *action.SelectSkillAction) {
if uint32(e.Args()[0]) < e.Ctx().Our.CurrentPet.Info.MaxHp {
e.l.Do(func() {
e.oldtype = e.Ctx().Our.CurrentPet.Info.MaxHp
e.Ctx().Our.CurrentPet.Info.MaxHp -= uint32(e.Args()[0])
})
}
}
func (e *Effect38_sub) Switch(in *input.Input, at info.AttackValue, oldpet *info.BattlePetEntity) bool {
return true
}
type Effect38_sub struct {
node.EffectNode
oldtype uint32
l sync.Once
}
func (e *Effect38_sub) Alive(t ...bool) bool {
if e.BoolisFalse(t...) { //说明到了回合结束取消节点,那么就将变化过的属性变化回来
//还原属性
e.Ctx().Our.CurrentPet.Info.MaxHp = e.oldtype
}
return e.EffectNode.Alive(t...)
}
func init() {
ret := &Effect38{}
input.InitEffect(input.EffectType.Skill, 38, ret)
}