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.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.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) { // 计算恢复量:自身最大体力 / n(n=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(_ model.AttackValue) { // 计算伤害量:对方下只精灵最大体力 / n(n=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(_ 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) } } }