Files
bl/logic/service/fight/effect/EffectDefeatTrigger.go
xinian 9c6f3988de
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
refactor: 重构 CurrentPet 为 CurPet
2026-04-04 04:34:43 +08:00

178 lines
5.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package effect
import (
"blazing/logic/service/fight/action"
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
"blazing/modules/player/model"
"github.com/alpacahq/alpacadecimal"
)
// -----------------------------------------------------------
// 通用效果:当次攻击击败对方精灵时,触发指定行为
// -----------------------------------------------------------
type EffectDefeatTrigger struct {
FixedDuration1Base
can bool // 标记技能是否生效(当次攻击有效)
effectID int // 效果ID用于区分不同触发行为
isd bool
info model.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) SwitchOut(in *input.Input) bool {
// 1. 检查效果是否生效(当次攻击有效)
// 2. 过滤我方切精灵的情况(只处理对方切精灵)
if in == e.Ctx().Our {
return true
}
if e.Ctx().Opp.CurPet[0].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.isd { //不是击败触发
return true
}
// 2. 过滤我方切精灵的情况(只处理对方切精灵)
if in == e.Ctx().Our {
return true
}
e.triggerByID(e.info)
return true
}
// SetArgs统一设置持续时间为1回合
// -----------------------------------------------------------
// 根据effectID触发对应行为
// -----------------------------------------------------------
func (e *EffectDefeatTrigger) triggerByID(at model.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(_ model.AttackValue) {
// 计算恢复量:自身最大体力 / nn=SideEffectArgs[0]
maxHP := e.Ctx().Our.CurPet[0].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
func (e *EffectDefeatTrigger) triggerReduceNextHPOnDefeat(_ model.AttackValue) {
// 计算伤害量:对方下只精灵最大体力 / nn=SideEffectArgs[0]
nextMaxHP := e.Ctx().Opp.CurPet[0].Info.MaxHp // 假设CurPet为下次出战精灵
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级
func (e *EffectDefeatTrigger) triggerLevelUpOnDefeat(_ model.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]))
}
// triggerNextEnemyStatusOnDefeat击败指定类型对手后下一个出场对手进入指定状态对应Effect185
// 参数定义:
// SideEffectArgs[0] = 目标对手类型如info.PetType.Fire表示火系
// SideEffectArgs[1] = 要施加的状态如info.PetStatus.Burned表示烧伤
// SideEffectArgs[2] = 状态持续回合
func (e *EffectDefeatTrigger) triggerNextEnemyStatusOnDefeat(at model.AttackValue) {
// 这里补充原逻辑中状态施加的完整判断(如检查对手类型是否匹配)
// 简化示例:直接处理状态施加
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 model.AttackValue) {
// 复制被击败对手的能力提升
for i, v := range at.Prop[:] {
if v > 0 {
e.Ctx().Our.SetProp(e.Ctx().Our, int8(i), v)
}
}
}