Files
bl/logic/service/fight/effect/EffectDefeatTrigger.go

188 lines
6.1 KiB
Go
Raw Normal View History

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/alpacahq/alpacadecimal"
)
// -----------------------------------------------------------
// 通用效果:当次攻击击败对方精灵时,触发指定行为
// -----------------------------------------------------------
type EffectDefeatTrigger struct {
node.EffectNode
can bool // 标记技能是否生效(当次攻击有效)
effectID int // 效果ID用于区分不同触发行为
isd bool
info info.AttackValue
}
// 工厂函数:创建"击败触发"效果实例传入效果ID
func newEffectDefeatTrigger(effectID int) *EffectDefeatTrigger {
return &EffectDefeatTrigger{
effectID: effectID,
}
}
// 初始化:批量注册所有"击败触发"类效果
func init() {
registerDefeatTriggerEffects()
}
// 批量注册绑定效果ID与对应实例
func registerDefeatTriggerEffects() {
// 注册所有击败触发类效果的ID
effectIDs := []int{66, 67, 158, 185, 421}
for _, id := range effectIDs {
input.InitEffect(input.EffectType.Skill, id, newEffectDefeatTrigger(id))
}
}
// -----------------------------------------------------------
// 共性逻辑OnSkill标记生效Switch检查条件并触发行为
// -----------------------------------------------------------
// OnSkill命中时标记当次攻击可触发效果
func (e *EffectDefeatTrigger) OnSkill() bool {
e.can = true // 标记当次攻击有效
return true
}
func (e *EffectDefeatTrigger) SwitchOut(in *input.Input) bool {
// 1. 检查效果是否生效(当次攻击有效)
if !e.can {
return true
}
// 2. 过滤我方切精灵的情况(只处理对方切精灵)
if in == e.Ctx().Our {
return true
}
if e.Ctx().Our.CurrentPet.Info.Hp > 0 {
return true
}
e.isd = true
e.info = *e.Ctx().Opp.AttackValue
return true
}
// Switch检查是否击败对方满足条件则根据effectID触发对应行为
func (e *EffectDefeatTrigger) SwitchIn(in *input.Input) bool {
// 1. 检查效果是否生效(当次攻击有效)
if !e.can {
return true
}
if !e.isd { //不是击败触发
return true
}
// 2. 过滤我方切精灵的情况(只处理对方切精灵)
if in == e.Ctx().Our {
return true
}
e.triggerByID(e.info)
return true
}
// SetArgs统一设置持续时间为1回合
func (e *EffectDefeatTrigger) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(1)
}
// -----------------------------------------------------------
// 根据effectID触发对应行为
// -----------------------------------------------------------
func (e *EffectDefeatTrigger) triggerByID(at info.AttackValue) {
switch e.effectID {
case 66:
e.triggerHealSelfOnDefeat(at)
case 67:
e.triggerReduceNextHPOnDefeat(at)
case 158:
e.triggerLevelUpOnDefeat(at)
case 185:
e.triggerNextEnemyStatusOnDefeat(at)
case 421:
e.triggerTransferBoostsOnDefeat(at)
}
}
// -----------------------------------------------------------
// 差异化行为实现
// -----------------------------------------------------------
// triggerHealSelfOnDefeat击败对方后恢复自身最大体力的1/n对应Effect66
func (e *EffectDefeatTrigger) triggerHealSelfOnDefeat(_ info.AttackValue) {
// 计算恢复量:自身最大体力 / nn=SideEffectArgs[0]
maxHP := e.Ctx().Our.CurrentPet.Info.MaxHp
healAmount := alpacadecimal.NewFromInt(int64(maxHP)).Div(alpacadecimal.NewFromInt(int64(e.SideEffectArgs[0])))
// 执行回血
e.Ctx().Our.Heal(e.Ctx().Our, &action.SelectSkillAction{}, healAmount)
}
// triggerReduceNextHPOnDefeat击败对方后减少对方下次出战精灵最大体力的1/n对应Effect67
2025-11-15 22:17:43 +00:00
func (e *EffectDefeatTrigger) triggerReduceNextHPOnDefeat(_ info.AttackValue) {
// 计算伤害量:对方下只精灵最大体力 / nn=SideEffectArgs[0]
nextMaxHP := e.Ctx().Opp.CurrentPet.Info.MaxHp // 假设CurrentPet为下次出战精灵
damageAmount := alpacadecimal.NewFromInt(int64(nextMaxHP)).Div(alpacadecimal.NewFromInt(int64(e.SideEffectArgs[0])))
// 执行伤害
e.Ctx().Opp.Damage(e.Ctx().Our, &info.DamageZone{
Type: info.DamageType.Fixed,
Damage: damageAmount,
})
}
// triggerLevelUpOnDefeat击败后m%概率提升自身XX等级+n对应Effect158
// 参数定义:
// SideEffectArgs[0] = m触发概率如30=30%
// SideEffectArgs[1] = XX等级类型如1=攻击等级对应info.LevelType枚举
// SideEffectArgs[2] = n提升的等级值如1=+1级
2025-11-15 22:17:43 +00:00
func (e *EffectDefeatTrigger) triggerLevelUpOnDefeat(_ info.AttackValue) {
// 1. 检查参数是否足够
if len(e.SideEffectArgs) < 3 {
return
}
// 2. 概率判定m% = SideEffectArgs[0]
m := e.SideEffectArgs[1]
success, _, _ := e.Input.Player.Roll(m, 100)
if !success {
return
}
// 3. 提升对应等级
e.Ctx().Our.SetProp(e.Ctx().Our, int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[2]), info.AbilityOpType.ADD)
}
// triggerNextEnemyStatusOnDefeat击败指定类型对手后下一个出场对手进入指定状态对应Effect185
// 参数定义:
// SideEffectArgs[0] = 目标对手类型如info.PetType.Fire表示火系
// SideEffectArgs[1] = 要施加的状态如info.PetStatus.Burned表示烧伤
// SideEffectArgs[2] = 状态持续回合
func (e *EffectDefeatTrigger) triggerNextEnemyStatusOnDefeat(at info.AttackValue) {
// 这里补充原逻辑中状态施加的完整判断(如检查对手类型是否匹配)
// 简化示例:直接处理状态施加
2025-11-15 14:23:52 +00:00
for i, v := range at.Status {
if v > 0 {
nv := e.Ctx().Our.InitEffect(input.EffectType.Status, int(i))
if nv != nil {
e.Ctx().Opp.AddEffect(e.Ctx().Our, nv)
}
}
}
}
// triggerTransferBoostsOnDefeat击败对手后复制其所有能力提升效果到自身对应Effect421
func (e *EffectDefeatTrigger) triggerTransferBoostsOnDefeat(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)
}
}
}