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

74 lines
2.4 KiB
Go
Raw Normal View History

package effect
import (
"blazing/logic/service/fight/info"
"blazing/logic/service/fight/input"
)
// -----------------------------------------------------------
// 通用效果:受物理攻击时概率附加指定状态(如麻痹、冰冻等)
// -----------------------------------------------------------
type EffectPhysicalAttackAddStatus struct {
RoundEffectSideArg0Base
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) Skill_Use_ex() bool {
// 2. 技能为空或非物理攻击,不触发
skill := e.Ctx().SkillEntity
if skill == nil || skill.Category() != info.Category.PHYSICAL {
return true
}
// 3. 概率判定Args()[1]为触发概率)
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
if !success {
return true
}
// 5. 获取状态效果实例并设置参数
statusEffect := e.Ctx().Our.InitEffect(input.EffectType.Status, int(e.targetStatus))
if statusEffect == nil {
return true
}
// 6. 给对手添加状态
e.Ctx().Opp.AddEffect(e.Ctx().Our, statusEffect)
return true
}
// 设置参数(复用父类逻辑)