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

171 lines
5.8 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/logic/service/fight/node"
"github.com/alpacahq/alpacadecimal"
)
// -----------------------------------------------------------
// 通用效果:当次攻击击败对方精灵时,触发指定行为
// -----------------------------------------------------------
type EffectDefeatTrigger struct {
node.EffectNode
can bool // 标记技能是否生效(当次攻击有效)
effectID int // 效果ID用于区分不同触发行为
}
// 工厂函数:创建"击败触发"效果实例传入效果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 {
if !e.Hit() {
return true
}
e.can = true // 标记当次攻击有效
return true
}
// Switch检查是否击败对方满足条件则根据effectID触发对应行为
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.triggerByID(at)
}
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
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级
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) {
// 这里补充原逻辑中状态施加的完整判断(如检查对手类型是否匹配)
// 简化示例:直接处理状态施加
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)
}
}
}