178 lines
5.7 KiB
Go
178 lines
5.7 KiB
Go
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) {
|
||
// 计算恢复量:自身最大体力 / n(n=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) {
|
||
// 计算伤害量:对方下只精灵最大体力 / n(n=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)
|
||
}
|
||
|
||
}
|
||
}
|