Files
bl/logic/service/fight/effect/EffectPhysicalAttackAddStatus.go
昔念 c4d0119129 ```
refactor(fight): 重构击败触发效果机制,优化代码结构

将 EffectDefeatTrigger 中的回调函数模式改为基于 effectID 的 switch-case 实现,
移除冗余的 defeatTriggerFunc 类型定义。统一通过 triggerByID 方法根据 ID 分发执行具体行为,
提高可维护性和扩展性。

同时更新 AddEffect 方法签名以支持传入主动方输入上下文,增强效果添加时的控制逻辑。
修复部分效果在添加状态时未正确传递施加者信息的问题。

此外,清理了部分注释和无用代码,使逻辑更清晰。
```
2025-11-14 03:21:00 +08:00

98 lines
3.2 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/info"
"blazing/logic/service/fight/input"
"blazing/logic/service/fight/node"
)
// -----------------------------------------------------------
// 通用效果:受物理攻击时概率附加指定状态(如麻痹、冰冻等)
// -----------------------------------------------------------
type EffectPhysicalAttackAddStatus struct {
node.EffectNode
targetStatus info.EnumPetStatus // 差异化:要附加的目标状态
}
// 工厂函数:创建"物理攻击触发状态"效果实例
func newEffectPhysicalAttackAddStatus(status info.EnumPetStatus) *EffectPhysicalAttackAddStatus {
return &EffectPhysicalAttackAddStatus{
targetStatus: status,
}
}
// 初始化:批量注册所有"物理攻击触发状态"类效果
func init() {
registerPhysicalAttackAddStatusEffects()
}
// 批量注册绑定效果ID与对应的目标状态
func registerPhysicalAttackAddStatusEffects() {
// 效果ID与目标状态的映射84=麻痹92=冰冻,可按需扩展其他状态)
statusMap := map[int]info.EnumPetStatus{
84: info.PetStatus.Paralysis, // Effect84物理攻击触发麻痹
92: info.PetStatus.Frozen, // Effect92物理攻击触发冰冻
108: info.PetStatus.Burned, // Effect108物理攻击触发灼烧
// 新增类似效果只需在这里加条目,例如:
// 100: info.PetStatus.Poisoned, // 物理攻击触发中毒
}
// 循环注册所有效果
for effectID, status := range statusMap {
input.InitEffect(input.EffectType.Skill, effectID, newEffectPhysicalAttackAddStatus(status))
}
}
// -----------------------------------------------------------
// 核心逻辑:受物理攻击时触发(覆盖父类方法)
// -----------------------------------------------------------
func (e *EffectPhysicalAttackAddStatus) Damage_DIV_ex(t *info.DamageZone) bool {
// 1. 命中判定失败,不触发
if !e.Hit() {
return true
}
// 2. 技能为空或非物理攻击,不触发
skill := e.Ctx().SkillEntity
if skill == nil || skill.Category() != info.Category.PHYSICAL {
return true
}
// 3. 概率判定Args()[1]为触发概率)
success, _, _ := e.Input.Player.Roll(e.Args()[1], 100)
if !success {
return true
}
// 4. 计算持续回合默认2~3回合支持通过参数指定
duration := e.getDuration()
// 5. 获取状态效果实例并设置参数
statusEffect := input.Geteffect(input.EffectType.Status, int(e.targetStatus))
if statusEffect == nil {
return true
}
statusEffect.Duration(duration)
statusEffect.SetArgs(e.Ctx().Our) // 目标为对手
// 6. 给对手添加状态
e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEffect)
return true
}
// 设置参数(复用父类逻辑)
func (e *EffectPhysicalAttackAddStatus) SetArgs(t *input.Input, a ...int) {
e.EffectNode.SetArgs(t, a...)
e.EffectNode.Duration(e.EffectNode.SideEffectArgs[0])
}
// 计算持续回合(封装为独立方法,增强可读性)
func (e *EffectPhysicalAttackAddStatus) getDuration() int {
// 优先使用配置的回合数SideEffectArgs[1]
if len(e.EffectNode.SideEffectArgs) > 1 {
return e.EffectNode.SideEffectArgs[1]
}
// 默认随机2~3回合Int31n(2)返回0/1+2后为2/3
return int(e.Input.FightC.GetRand().Int31n(2)) + 2
}